NAC2025
M.This Is Sparta!
反人类 ad-hoc,不过非常好玩。
首先有一个非常关键的 observation:大部分元素都会以非常快的速度变成 \(0\)。我们将非零元素的数量记作 \(N\),接下来将通过两个步骤证明 \(N\) 在几轮 trivial 的模拟之后会变成 \(3\)。
第一个步骤是值域分块中惯用的套路:
对所有元素进行值域分块。考虑有 \(\log V\) 个箱子,\(a_i\) 被放到了 \(\log a_i\) 这个箱子中,则每一轮模拟后每个箱子至少会有一半的数掉到下一个箱子中。
考虑两个相邻的、在同一个箱子中的数 \(a_{i-1}\) 和 \(a_i\),显然这两个数至少会有一个掉下去。设这个箱子中有 \(b\) 个数,则每轮至少会有 \(\lfloor\frac b2\rfloor\) 个数掉下去。总的势能是 \(\sum \log a_i\le N\log V\),每轮会减掉的势能为 \(\sim\frac N2\),\(N\) 趋近于下界 \(\log V\) 的速度看上去非常快,构造最坏情况可以发现只需 \(166\) 轮模拟。
接下来对 \(N=\log V\) 进行考虑,这些数还是太多了。我们可以在能承受的模拟次数内找到一个更紧的界。考虑对于这 \(N\) 个数,\(N\to N-1\) 的操作次数上界。设这个上界为 \(x\),我们去尝试构造这 \(N\) 个数,可以发现尽可能合理的情况(指构造尽可能多的数在值域要求内)一定形如 \(1,x,y,z,\dots\)。\(y\) 和 \(x\) 需要满足什么条件?显然在 \(x\) 变成 \(0\) 之前 \(y\) 都不能掉到它的前面,即 \(y-x-(x-1)-\dots\ge0\),这说明了 \(x=\sqrt{2y}\)。对于 \(z\) 有什么进一步的限制?在 \(x\) 变成 \(0\) 之前 \(z\) 就掉到 \(y\) 之前也是不优的,因此 \(y=\sqrt{2z}\)。
根据此种方式,可以发现一个让 \(N=\log V\to N=3\) 的模拟轮数上界 \(2\times 10^6\),由于这些模拟只需对于 \(\log V\) 个数模拟,因此可以接受。我们只需解决 \(N=3\) 的问题就做完整个题了!
对于 \(N=3\),设三个数为 \(a,b,c\),不难发现若顺序没有变化,模拟 \(k\) 轮以后为 \(a,b-ka,c-kb+\frac{k(k+1)}{2}a\)。只需找出每次顺序变化的位置即可。顺序变化次数的估计可以使用辗转相除法对两个相邻数之间交换进行估计,为 \(O(\log V)\)。
如何在场上通过这道题呢?需要通过感受整道题来大胆猜测暴力模拟一些轮就可以将问题变成规模极小的情况,OI 不能总是遇到题就硬做,应该有对整个题的感受。