• 带修莫队学习笔记


    序言

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

    (~)

    带修莫队

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

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

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

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

  • 相关阅读:
    Http option 请求是怎么回事
    Azure中配置和发布 Nginx docker到互联网
    Antdesign Form 实现页面控件的赋值加载
    windows下搭建spark+python 开发环境
    Python 使用有道翻译
    Docker安装
    Servlet使用注解配置URl提示404错误
    PowerShell自定义函数定义及调用
    使用代理实现对C# list distinct操作
    Asp.net 按钮幕布遮盖效果实现方式
  • 原文地址:https://www.cnblogs.com/cjtcalc/p/12381335.html
Copyright © 2020-2023  润新知