像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

2023-03-06 11:45阅读: 241评论: 1推荐: 2

Uoj228 基础数据结构练习题

Uoj228

最开始好像是在那个区间加区间 popcount 的题里看到有人提到这个题,就来写下。

离联合省选还有 26 天,发了一上午呆。


题意 区间加 区间开根 区间和 n,m105,1s 256mb

遇到区间开根这种显然无法整体打 Tag 的东西,一般考虑势能分析。

如果你做过这个题没有区间加的弱化版的话,考虑一个数开根 loglogn 次就会变成 1, 如果没有区间加的话,就维护一下区间里有没非 1 的数暴力开根就行了。

有这个区间加的话,简单分析一下可以发现:对于两个差很大的数,复合若干次 f(x)=x+a 后差会变得很小,进一步地,对于两个数 a,babab 给式子两边平方一下可以简单地发现。也就是说差大于 1 的两个数会在若干次复合后变成差为 1 的,再变成 0,其中有一种特殊情况就算 ba=1,b=z2,zZ 操作后差仍然为 1

也就是说对于两个同一个段里不同的数。即使有区间加,我们最多给他们各自开根 O(loglogn)=4 次后差就会变成 1

然后这个问题就变的清晰起来了,考虑分块:

如果一个块不满足所有数相同或开根后极差仍然为 1,就暴力开根,否则打标记处理和的变化。

考察每个块的极差作为势能,Φ(s) 表示状态 s 时的势能,令 Φ(s)=ploglog(max(p)min(p)),我们每暴力进行一次根号级别的暴力开根,新状态的势能至少减少 1,即 Φ(s)Φ(s)1,每次区间加或区间开根显然只会给边上的 O(1) 块带来 O(loglogn) 所以时间复杂度是均摊 O(nnloglogn) 的,可以摊成 O(nnloglogn) 但是更慢了,反正都不卡常随便过。

在 gjh 的提醒下,(并不是那么 ) 容易发现,因为区间操作的性质,上面那个分块的势能分析拿到 SegmentTreeBeats 上也是成立的,所以可以做到 O(nlognloglogn) 还更好写 [小丑]。

posted @   寂静的海底  阅读(241)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起