序言
写的有点草率,算是给自己加深一下印象吧 ...
(~)
带修莫队
考虑到莫队是 按询问排序 ,而修改操作是死死地 按时间轴进行 的,固然不能将 询问 和 修改 一视同仁。
我们仔细想想 " 修改操作按时间轴进行 " 这句话。
我们是不是可以在普通莫队的基础上,强行加上一个时间因素呢?
视每个询问操作为一个三元组 ((l,r,t)) :经过前 (t) 次修改后,询问区间 ([l,r]) ... (询问的东东)。
我们发现 ((l,r,t)) 的 (t) 这一维,也可以像 (l,r) 这些维一样扩展,使 ((l,r,t)) 扩展一步,一共有六种扩展方式:
- ((l,r,t)->(l-1,r,t))
- ((l,r,t)->(l+1,r,t))
- ((l,r,t)->(l,r-1,t))
- ((l,r,t)->(l,r+1,t))
- ((l,r,t)->(l,r,t-1))
- ((l,r,t)->(l,r,t+1))
对于 (t) 这一维的扩展,每次扩展,我们都要考虑操作的贡献:若是 (t) 变大了,则需要加上新操作对答案的贡献;若 (t) 变小了,则需要考虑扣除旧操作对答案的贡献。
以 (t) 变大为例,具体的,若当前修改操作对应的修改点为 (x) ,修改值为 (v) 。
若 (l leq x leq r) ,则表示 (x) 点原先的值 (A_x) 对答案有过贡献,需要先扣除 (A_x) 对答案的贡献,然后再考虑加上 (v) 对答案的贡献;否则表示 (x) 点原先的值对答案没有贡献,直接在序列上修改一下 (A_x) 即可。转移同样是 (mathcal{O(1)}) 。
(t) 变小同理。
带修莫队的分块方式是以 (n^{frac{2}{3}}) 为一块,分成了 (n^{frac{1}{3}}) 个块。
三元组 ((l,r,t)) 排序的第一关键字为 " (l) 所在的块 ",第二关键字为 " (r) 所在的块 ",第三关键字为 " (t) " 。
时间复杂度 (mathcal{O(n^{frac{5}{3}})}) 。
证明咕咕咕 ...
(~)
结语
写的真的很草率,神仙不要 D 我 qwq 。