数据结构维护技巧(长期更新)

拜谢lxl

维护函数复合

大概是每个位置上有一个函数f(x),给出[L,R]和初值v,算fR(fR1(fL(v)))

有个东西叫插入-标记-回收算法。

首先将所有询问离线,然后拿扫描线扫一遍序列。维护一个集合S,存每个询问的结果。

  1. 插入:扫到i后,如果这个地方是某个询问的起始位置,那么久把这个询问加入S

  2. 标记:从i1i,对S中所有询问的影响是一样的,通常在S上打标记实现。

  3. 回收:存在以i为右端点的询问,那么需要从S中取出以i为右端点的询问的答案。通常需要记录一下询问xS中的位置以实现快速查询。

I.QOJ # 8672. 排队

每个位置上有个函数f(x)=x+[x[li,ri]],每次同上询问[L,R],初值为0

Sol:

会上面那个东西就很简单了。在每个询问开头和结尾处记录一下。拿扫描线扫这个序列,遇到一个询问就插入。用一个FHQ-Treap维护S,每次插入就是向FHQ中插入一个值为0的点,打标记就是从FHQ中分裂出值在[li,ri]的点,然后整体加1。可以发现整体加一后仍然满足左树小于或等于右树,所以区间无交,正常合并即可。

插入一个点后存一下这个询问对应的点的编号,询问的时候直接找到那个点,然后暴力下传根到这个点路径上的标记,再查询其值。因为FHQ的树高保证了O(logn),一共q次,所以这部分是对的。然后就做完了。

posted @   RandomShuffle  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示