带修莫队学习笔记

序言

写的有点草率,算是给自己加深一下印象吧 ...

\(~\)

带修莫队

考虑到莫队是 按询问排序 ,而修改操作是死死地 按时间轴进行 的,固然不能将 询问修改 一视同仁。

我们仔细想想 " 修改操作按时间轴进行 " 这句话。

我们是不是可以在普通莫队的基础上,强行加上一个时间因素呢?

视每个询问操作为一个三元组 \((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 。

猜你喜欢

转载自www.cnblogs.com/cjtcalc/p/12381335.html
今日推荐