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)\)。

浙公网安备 33010602011771号