最开始好像是在那个区间加区间 \(\text{popcount}\) 的题里看到有人提到这个题,就来写下。
离联合省选还有 26 天,发了一上午呆。
题意 区间加 区间开根 区间和 \(n,m\leq10^5\),1s 256mb
遇到区间开根这种显然无法整体打 Tag 的东西,一般考虑势能分析。
如果你做过这个题没有区间加的弱化版的话,考虑一个数开根 \(\log \log n\) 次就会变成 \(1\), 如果没有区间加的话,就维护一下区间里有没非 \(1\) 的数暴力开根就行了。
有这个区间加的话,简单分析一下可以发现:对于两个差很大的数,复合若干次 \(f(x)=\sqrt{x+a}\) 后差会变得很小,进一步地,对于两个数 \(a,b\),\(\sqrt a-\sqrt b\leq \sqrt {a-b}\) 给式子两边平方一下可以简单地发现。也就是说差大于 \(1\) 的两个数会在若干次复合后变成差为 \(1\) 的,再变成 \(0\),其中有一种特殊情况就算 \(b-a = 1,b = z^2 ,z\in Z\) 操作后差仍然为 \(1\)。
也就是说对于两个同一个段里不同的数。即使有区间加,我们最多给他们各自开根 \(O(\log\log n) = 4\) 次后差就会变成 \(1\)。
然后这个问题就变的清晰起来了,考虑分块:
如果一个块不满足所有数相同或开根后极差仍然为 \(1\),就暴力开根,否则打标记处理和的变化。
考察每个块的极差作为势能,\(\Phi(s)\) 表示状态 \(s\) 时的势能,令 \(\Phi(s)=\sum_p\log \log ( \max(p)-\min(p) )\),我们每暴力进行一次根号级别的暴力开根,新状态的势能至少减少 \(1\),即 \(\Phi(s')\leq\Phi(s) -1\),每次区间加或区间开根显然只会给边上的 \(O(1)\) 块带来 \(O(\log \log n)\) 所以时间复杂度是均摊 \(O(n\sqrt n\log\log n)\) 的,可以摊成 \(O(n\sqrt {n\log\log n})\) 但是更慢了,反正都不卡常随便过。
在 gjh 的提醒下,( 容易发现,因为区间操作的性质,上面那个分块的势能分析拿到 SegmentTreeBeats 上也是成立的,所以可以做到 \(O(n\log n\log\log n)\) 还更好写 [小丑]。并不是那么
)