莫队_Part two
带修莫队
原来莫队还能带修 \(qwq\)
算法简介
普通莫队是不支持修改的……
但是根据 \(DP\) 的思想,我们可以再给莫队加上一个时间维,表示在这次查询之前有多少次的修改。
如果普通莫队每个询问是这样写的 \([l, r]\),那带修莫队就这样 \([l, r, time]\)
带修莫队也是可以 \(O(1)\) 转移到其他区间的状态上的,每次操作除了在端点上进行修改,还要对时间进行修改和比较。
带修莫队的排序方式变为块长为 \(n^{\frac{2}{3}}\),分成了 \(n^{\frac{1}{3}}\) 块,排序时第一关键字为左端点所在块,第二关键字为右端点所在块,第三关键字是时间。
时间复杂度证明:
- 若左右端点所在块不变,时间会单调右移,复杂度 \(O(n)\)
- 若左右端点所在块改变,时间维一次最多移动 \(n\) 个格子,复杂度 \(O(n)\)
- 左端点所在块一共有 \(n^{\frac{1}{3}}\) 种,右端点也有 \(n^{\frac{1}{3}}\) 种,一共有 \(n^{\frac{1}{3}} \times n^{\frac{1}{3}} = n^{\frac{2}{3}}\) 种,每种乘上移动的复杂度 \(O(n)\),总复杂度为 \(O( n^{\frac{5}{3}} )\)。