CodeChef Chef and Churus 题解

对给出的 n 个区间分块,设块长为 B

每个块内计算每个位置的贡献(被覆盖次数)。具体地,记 fi,j 表示第 i 个块第 j 个数被覆盖了多少次,这个可以用差分轻松维护。预处理复杂度 O(n2B)

现在考虑修改。记 ansi 表示块 i 的贡献,那么对于每个块 iansiansifi,x×ax+fi,x×y 即可。对每个块处理完后再令 ax=y。时间复杂度 O(mnB)

最后是查询。整块直接累加 ans 值即可,问题是散块。一个 naive 的想法是对每一块维护一个线段树/树状数组 ,然后对 2B 个区间都求一下区间和。但是这样复杂度会带 log,不是很优。

考虑对原序列再分一次块,但是发现如果每个位置维护当前 ai 的值的话复杂度会凭空多一个 B,显然不行。转换思路,第 i 个位置维护 j=1iaj,也就是前缀和。那么单点修改就对应了 [x,n] 这一个区间的修改,复杂度 O(B+nB),查询就直接 O(1) 差分即可。这样散块的复杂度就变成了 O(nB+B)

现在重新分析一下复杂度:预处理复杂度不变。而区间和原序列的分块互不影响,所以修改的复杂度为 O(mnB+B+nB),查询复杂度 O(nB+B)。此时 Bn 最优,为 O(nn)n,m 同级),实现了复杂度平衡。

代码:

咕咕咕。

posted @   Southern_Dynasty  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示