【题解】P9057 [Ynoi2004] rpfrdtzls

换维扫描线+历史和。

对序列扫描线,维护时间轴上的询问
先不考虑 1,那么可以拉出来当前还在的前后 \(\log V\)\(x\),然后更新 \(O(\log V)\) 个段的答案。这里可以通过双指针做到 \(O(\log V\log n)\),瓶颈在查询前驱后继。
所以这里是一个区间覆盖,查询单点历史和。

然后考虑有 1 怎么做。
用另一个数据结构维护区间加减单点历史和,考虑将 \([l,r]\) 时间内的答案都设为 \(x\) 后还要额外加上 \([l,r]\)\(1\) 的贡献。
所以可以只维护 \(>1\) 分出段内的前缀和。


很遗憾,\(O(q\log V\log n)\) 过不了。怎么办呢?
首先 2log 的部分其实只有:

  • 提取出连续的 \(O(\log V)\)\(>1\)\(x\)
  • 对这连续的 \(O(\log V)\) 个段进行区间赋值,维护单点历史和。

对于平衡树上连续的一些点,我们可以进行 dfs,这样就找到了他们的编号,只需要花费 \(O(\log V+\log n)\) 的代价。
对于区间推平,单点历史和,可以考虑维护当前连续段的历史和,以及以前的历史和。
这样维护连续段的历史和可以和上面一样,挂到 \(x\) 上维护,查询的时候找到前驱。
如果某个 \(x\) 被删除或者被插入,连续段被合并或者分裂,涉及到的 \(O(1)\) 个位置要清空历史和并进行线段树区间加。

这样整个题都做到了 \(O(m(\log n+\log V))\)

posted @ 2026-09-02 21:53  TallBanana  阅读(6)  评论(0)    收藏  举报