下面记 i 位置上初始时有 ai 颗星星。
首先,可以证明任何一个状态可以抵达的终止状态(被定义为无法进行任何操作的状态)是一定的,与操作无关:
证明:
考虑存在两个合法序列,分别在 i 上操作了 ui 和 vi 次,因为序列无法继续操作,则 ai−2ui+ui−1+ui+1≤1。
因为 u 和 v 不同,不妨记录第一次出现某个 vi 大于 ui 的位置在 i(小于的情况显然是对称的),记录此时状态为 w。由于这是第一次超过,所以邻居满足 wi−1≤ui−1,wi+1≤ui+1,那么有:ai−2wi+wi−1+wi+1≤ai−2ui+ui−1+ui+1≤1。
但是要操作 i 至少要有两颗星星,矛盾!
故 u 和 v 相同。
(注:可能更直观的理解方式是:现在不对 x 操作未来也要操作,但这不太好书写,上面的内容实际上在形式化表述这件事)
接下来我们考虑求出最终的稳定状态,这可以通过每次尝试分裂区间完成,我们从小到大插入点,不难发现势能是 O(n) 的,使用 map 之类的东西就可以快速维护。
求出稳定状态后,可以简单地求出 ti 代表 i 位置上被操作了多少次,记稳定状态是 b。不妨设 mex 为 m,则如果要让它更大,我们需要进行若干次 (x−1),(x+1)→x,x 的反向操作。如果想要让 mex 变大 k,我们需要进行若干次反向操作。经过一些推导,以下条件是必要的:
- b 中存在 −1,m+1,m+2,⋯m+k,否则我们无法完成移动。
- 定义 hi 为 i 被 [0,m],[1,m+1],⋯[k−1,k−1+m] 中的多少个区间覆盖,则应该有 ti≥hi,这是因为我们必须在 i 位置上完成 hi 次撤销。
我们下面证明这个条件是充分的:
我们从 b 开始依次撤销区间,第 i 次尝试撤销 [i,i+m](我们下文将用 c 来代表当前的状态),我们将会通过一些精细的讨论证明:每个状态都是由初始状态可达的:
我们归纳的证明区间 [i,i+m] 在 撤销前 始终满足如下结构:ci−1≥1,ci,ci+1,⋯ci+m−1=1,ci+m=0,ci+m+1=1,并且在 撤销前,存在一种操作序列使得 [i,i+1,⋯,i+m] 是操作序列的后缀。
首先我们证明如果满足上述结构,那么一定存在操作序列使得 [i,i+1,⋯,i+m] 是操作序列的后缀:这是因为 i+m 位置一定被操作过。且 i+m 是否操作只会影响 i+m±1 能否操作。但是最后 i+m 位置为 0,故 i+m 最后一次操作后一定没有 i+m±1 影响它,故我们可以将对 i+m 的操作调整至最后!随后我们撤销 i+m 的操作,此时 i+m−1 变为 0!依次向前递推便可以撤销掉这个区间的操作。我们发现操作后 [i+1,i+m] 变为 1,i+m+1 变为 0。同时因为对 b 的判定,i+m+2 是 1。故符合我们的归纳假设。
因此条件是充分的,证毕。
二分检查上述条件即可,复杂度 O(nlogn)。
本题的部分分主要按照 ∑n 和 ai 的范围分层。小范围数据中,点的位置和数量都很小,选手可以直接模拟可达状态,或者用 BFS 枚举演化过程,从而观察 mex 的变化规律。中等范围数据限制 ai 不大,允许选手使用数组维护每个位置的点数与可达区间。特殊性质中所有 ai 相同,结构非常规整,可以先分析单点堆积向两侧扩散的规律。最终数据中 ai 可达 109,要求选手不能依赖位置值域,而要维护若干区间或事件,直接刻画哪些位置最终可能出现。