cdl 的题

Statement

CloudDreamLaker 嫌上一题太简单,又出了一道数据结构题:

  1. 添加一个操作:把 \([l,r]\) 区间中的数加上 \(x\)
  2. 添加一个操作:把 \([l,r]\) 区间中的数乘以 \(x\)
  3. 询问如果我执行了 \([l,r]\) 区间的操作,\(pos\) 这一个点的值会变为多少。

序列有初值,强制在线

Solution

发现只用维护标记 \(ax+b\) 即可,两个标记 \(ax+b\)\(cx+d\) 合并是 \(ac\cdot x+bc+d\).

对操作维护线段树,每个节点内维护若干个标记不同的区间表,表示该时间段的操作在每段区间上的作用效果.

注意不是维护整个序列,因为这样空间 + 时间都炸了;而是维护每个标记不同的区间的断点,每次新加一个操作最多新增两个断点,就与当前区间长度相关了.

查询时在线段树上找到 \(\log n\) 个点,每个点在表上二分找即可,\(O(n\log^2n)\).

其实这就是二进制分组的另一种形式。我们就按这种方式去理解他就行了.


更好懂的题解,本质相同:

可以对每次操作建立关于时间的线段树,每个节点 \([L,R]\) 保存第 \(L\) 次操作到第 \(R\) 次操作对数组的影响(用段来表示,同一段内 \(a\)\(b\) 的值相同,设 \(T\) 为当前时间段的操作次数,则最多 \(2T\) 个段),

用归并排序的思想对线段树左子树与右子树进行合并,每次插入一个操作时需要进行 \(\log n\) 次归并,每次归并平均 \(\log n\) 的时间所以总的时间复杂度 \(m\log^2n\),查找的时间为 \(\log n\) 查找节点 \(\log n\) 查找第 \(k\) 个位置,空间复杂度 \(n\log n\)

离线怎么分治啊,不会。

posted @ 2024-08-10 10:02  Laijinyi  阅读(6)  评论(0编辑  收藏  举报