ABC342G Retroactive Range Chmax

题目传送门

  • 给出长度为 \(n\) 的数组 \(a_1\sim a_n\)。有 \(q\) 次操作,\(3\) 种类型:

    • \(1\space l\space r\space x\),对于 \(i\in[l,r]\),执行 \(a_i\leftarrow \max(a_i,x)\)

    • \(2\space x\),取消第 \(x\) 次操作,保证这是操作 \(1\)。即在 \(a\) 数组初始状态上按顺序执行从初始时刻到当前时刻除 \(x\) 以外的所有 \(1\) 操作后得到新的数组 \(b\),然后令 \(a\leftarrow b\)

    • \(3\space x\),查询 \(a_x\)

考虑建立线段树,每个节点维护一个集合 \(S_i\)。记 \(a\) 数组的初始状态为 \(A\) 数组。对于一个对应下标为 \(p\) 的叶子节点 \(u\),记它根链路径上的点构成的集合为 \(P\),我们在线段树上实时维护 \(p=\max\{A_p,\max\limits_{i\in P}\max\limits_{j\in S_i}j\}\)

对于 \(1\) 操作,在线段树上找到覆盖这个区间的节点,则这些子树内部的所有叶子都仍要对 \(x\)\(\max\),因此在这些节点的 \(S\) 上插入 \(x\)

\(2\) 操作类似,在线段树上找到覆盖这个区间的节点,则这些子树内部的所有叶子原本要对 \(x\)\(\max\),这个操作取消后就不需要对它取 \(\max\) 了,因此在这些 \(S\) 中删除 \(x\)

\(3\) 操作,直接单点查询然后对根链上的 \(S\)\(\max\) 即可。

multiset 维护 \(S\),时间复杂度为 \(\mathcal{O}(n+q\log^2 n)\),空间复杂度为 \(\mathcal{O}(q+n\log n)\)

AC Code

posted @ 2024-02-24 21:58  lzyqwq  阅读(68)  评论(0)    收藏  举报