前言

是啊,我觉得我打 oi 的时候会做这个题,

思路

正难则反,从最后全 00 的状态往前做。

考虑每个时刻 aia_i 最大是多少(上界)。对于一个能在 tt 次操作后被清零的数组 aia_i,任意一个满足 biaib_i\leq a_i 的数组 bb 也可以在 tt 次操作后被清零。

在第 tt 个时刻,对于这一次被选中的下标 iiaia_i 的上界可以是 2ai+12a_i\color{red}+1,而对于没有选中的下标 jj,其上界则会变为 2aj2a_j

如果答案为 TT,那么在第 tt 个时刻选中 aia_i,相当于给最终 aia_i 的上界加上了 2Tt2^{T-t}

固定答案 TT 后,问题的形式变成:你现在有 S=20,21,22,,2T1S=2^0,2^1,2^2,\cdots,2^{T-1},每次你可以选定一个下标 ii,将其中的一个数字 xSx\in S 分配给 aia_i,让 aiai+xa_i\leftarrow a_i+x,并从 SS 里删去 xx

可以采用贪心策略来解决这个问题。从大到小枚举 22 的幂次 2k2^k 分配给当前 aa 中最大的元素 aia_i,令 aiai2ka_i\leftarrow a_i-2^k 即可。容易证明其正确性。

在实现上,先二分答案 T[n,n+logV+1]T\in [n,n+\log V+1]。我们可以用很低的复杂度来 check:对于所有 k>logVk>\log V2k2^k 都可以直接消灭一个元素,前 w=max(T(logV+1),0)w=\max(T-(\log V+1),0) 大的元素都会直接被消灭。因此只需要取前 nwn-w 小的元素出来做即可。

复杂度 O(nlogn)\mathcal{O}(n\log n),瓶颈在排序。