大概会持续更新?似乎是配套分块指北的呢!
很多题都没代码(
最初分块
区间 \(x\) 改成 \(y\) 的操作有个 trick。
我们将序列分块,每块在值域上维护一个并查集,将所有值为 \(x\) 的位置的父亲设为 \(rt_x\)。我们要保证一棵树内所有元素的值都是根对应元素的值。
整块修改简单,直接把并查集一连完事。散块的话可以暴力,首先将所有位置的真实值下放到数组上,然后对数组暴力重构即可。
然后这题需要维护一个 \(k\) 小值。这点简单,我们只需要维护一个前缀的值域分块,就能 \(O(\sqrt n)\) 查询了。
于是我们可以在并查集上维护每颗树的大小,前后两个散块暴力维护后缀信息即可。整块顺着扫一遍。
总时间复杂度 \(O(n\sqrt n)\)。代码实现较困难(
第二分块
这题老炒冷饭了
22.8.7写了一次
22.10.13又写了一次
所以这不写了
总时间复杂度 \(O(n \sqrt n)\)!
作业
一眼莫队。
然后莫队完了就变成给定一个序列查询 \(O(n)\) 次区间和了,同时需要支持 \(O(1)\) 修改。
这个东西可以直接值域分块。
做完了。复杂度 \(O(n \sqrt n)\)。
Bonus:空间开大点(指 512MB)能不能实现强制在线?
risrqnis
指路:题解!
CF925E
会个 \(O(n\sqrt \log n)\) 的。
首先初始化 \(a_i = -t_i\)。然后白\(to\)黑就是给它到根的链上每个 \(a_i\) 自增,给自己打标记;黑\(\to\)白就是给它到根的链上每个 \(a_i\) 自减,删掉自己的标记。答案就是 \(\sum_i [a_i > 0]\times [a_i\text{没标记}]\)。
首先树用 dfn 序拍成序列。
发现这玩意可以树剖,树剖完了就是 \(O(\log n)\) 段区间加了。整块维护一个 lazy 标记,值域上统计一个每个值没标记的数的数量。然后整块对答案的贡献可以 \(O(1)\)。
散块仍然是暴力重构。
记得单点改。
复杂度 \(O(n \sqrt n \log n)\)。
\(O(n\sqrt n)\) 不会。