洛谷 P3437
矩阵查最大值,矩阵取 \(\max\)
区间修改的线段树套线段树。众所周知,树套树的外层结构是无法 pushdown 的(难道下传一棵线段树),同样也是不可以 pushup 的(难道合并两棵线段树),那如何处理这种区间操作的问题?答案是标记永久化,同时要递归到一个区间时快速算出修改一个子区间后的信息(最大值)。
我们先看看一维的情况。我们维护区间最大值 \(mx\),以及下传的标记 \(lzy\)。
那么区间对 \(v\) 取 \(\max\) 操作就是对和 \([ql, qr]\) 有交区间执行 mx = max(mx, v),同时对包含于 \([ql, qr]\) 的区间执行 lzy = max(lzy, v)
而求区间最大值操作相当于对于和 \([ql, qr]\) 有交的区间执行 ans = max(ans, lzy)(因为最后会下传到一个包含于 \([ql, qr]\) 的区间),包含于 \([ql, qr]\) 的区间执行 ans = max(ans, mx) 即可。
在考虑二维的情况,其实就是对外层结构的 \(mx, lzy\) 两个变量改成两棵动态开点线段树,然后转化为一维问题即可。
时间复杂度:\(O(n \log^2 V)\)
因为树套树有些功能是没有的(pushdown, pushup),所以要首先想到一个只用树套树操作的一维解决方式,然后外面再套一层即可。
这也是它的局限性,所以出的少。(只要不在线,一般可以使用 cdq 分治/整体二分 替代。)
浙公网安备 33010602011771号