2024.8.6 test
以后不记录躺尸题了。
B
有 \(n\) 个序列对应 \(n\) 个人,每个序列长度为 \(k_i\)。你可以花费 \(a_{i,j}\) 的时间把第 \(i\) 个人从 \(j-1\) 提升到 \(j\) 级。
求前 \(m\) 个时刻,每个时刻里每个人级数的和的和最大值。\(\sum k\le 2e6,m\in [10^{10},10^{11}],a\le 3000\).
注意到 \(m\) 非常大,足以把每个人提升完。
想象一下我们现在将做的是什么?设一个长度为 \(\sum k\) 的序列 \(b\),满足任意 \(a_{i,j-1}\) 的位置先于 \(a_{i,j}\)。
贡献是 \(\sum_i (m-\sum_{j\le i}b_j)=m\sum k-\sum_i sum_i\),其中 \(sum_i\) 是 \(b\) 的前缀和。
最小化 \(b\) 前缀和的和,首先直接贪心是错的,会诸如被 \(a_{i,1}\) 很大,后面很小的卡掉。
这启发我们 \(a\) 必须一段一段加。还是沿用贪心的想法,每次加入“平均数最小”的段。
为何呢?我们想 \(b\) 中一段数由于另一段数,一定是前面这段平均数更小,利用 Exchange Argument.
先把 \(a\) 给切分好,切成平均数不降的若干段,即维护一个栈,每加入一个数就看能不能往前合并。
最后再从小到大排序。
D
有 \(n\) 个数,你每次取两个数出来,并把其平均数放回去,必须是整数。
构造方案使得最后只有一个数,或判断无解。\(n\le 10^5\)。
按 \(\bmod 4\) 分类并讨论。
已经被证明的是随机不可卡,所以考虑随机化。