loj#P4019. 「CEOI2023」Brought Down the Grading Server?

「CEOI2023」Brought Down the Grading Server?

题目描述

题目译自 CEOI 2023 Day1 T3「Brought Down the Grading Server?

忙碌的首个比赛日已经过去……虽然科学委员会艰难地击退了对测评服务器的黑客攻击,但他们担心这影响了提交的评分。现在只有一个选择:所有提交都必须重测!

测评服务器有 NN 个处理器核心。委员会已经给每个核心安排了一个由 SS 份提交组成的列表,每份提交属于比赛中 TT 道题(编号为 1,,T1,\ldots,T)中的一道。委员会确定了 SS 是二的幂。(由于一个 bug(Wolfgang 你有一个新需求),否则测评系统会崩溃,导致所有防火墙瘫痪,并可能暴露敏感信息!)现在,在接下来 SS 分钟,每分钟每个核心会测评列表里恰好一个提交。

不幸的是,包含测评数据的数据库十分脆弱,如果同时请求单题数据的次数变化很大,数据库就会崩溃。因此,委员会希望对每个核心题目的提交进行排序,以便在重测时,每道题同时测评的最大和最小提交数最多相差一份。

写一个程序计算这样对于每个核心的提交排序方式。

输入格式

第一行包含三个整数 N,S,TN,S,T,含义如题目描述。

接下来 NN 行,每行描述分配给每个核心的提交。第 ii 行包含 SS 个整数 t1,,tS (1tjT)t_1,\ldots,t_S\ (1\le t_j\le T),表示第 ii 个核心分配到了测评题目 t1,,tSt_1,\ldots,t_S 的提交。

输出格式

你的程序需要输出 NN 行,描述提交到每个核心的分配方案,从而使每道题同时测评的最大和最小提交数最多相差一份: 第 ii 行应包含 SS 个整数 r1,,rSr_1,\ldots,r_S,表示第 ii 个核心在第 jj 分钟测评一份对题目 rjr_j 的提交。保证对于每个测试点,这样的分配方案均存在。

3 2 3
1 2
2 3
2 3

2 1
3 2
2 3

对于第一个样例的输出,对于题目 1122,连续测评的提交数最大值和最小值之差为 11,对于题目 33 这个值为 00。另一方面,按输入排列提交不是一个合法的输出,因为这时对于题目 33,连续测评的提交数最大值和最小值之差为 22

3 4 3
2 3 2 2
2 3 3 2
2 2 3 2

2 2 2 3
3 2 3 2
2 3 2 2

对于第二个样例的输出,对于所有三道题,连续测评的提交数最大值和最小值之差为 00

数据范围与提示

对于所有数据,满足 1N,S,T105,NS5×1051\le N,S,T\le 10^5,N\cdot S\le 5\times 10^5。保证存在正整数 kk 使得 S=2kS=2^k

详细子任务附加限制及分值如下表所示。

子任务 附加限制 分值
11 S=2,N,T20S=2,N,T\le 20 1010
22 S=2S=2 10+5+510+5+5
33 NS104N\cdot S\le 10^4 15+5+515+5+5
44 无附加限制 20+10+1020+10+10

在子任务 2,3,42,3,4 中,你可以如「分值」一栏所示获得部分分:

  • 第一个数字代表如果你解决了所有满足 TNT\le N 且每道题的提交总数能被 SS 整除的测试点所能获得的分值。
  • 第二个数字代表如果你解决了所有满足 TNT\le N 的测试点所能获得的附加分值。
  • 第三个数字代表如果你解决了所有测试点所能获得的附加分值。

在 LibreOJ,对于第 ii 个子任务的第 jj 个部分分,测评页面中显示为第 3(i2)+j+23\cdot(i-2)+j+2 个子任务。如第 33 个子任务的第 22 个部分分显示为第 3(32)+2+2=73\cdot (3-2)+2+2=7 个子任务。