【笔记】线段树技巧学习笔记
标记永久化
一般情况下,因为一些原因线段树不能 pushdown
,线段树上的每个节点维护的信息表示只考虑子树内的操作的信息,每次查询信息累加父节点标记。
例:维护区间最大值
struct Node {
int subtree_max, delta;
};
每次修改时:
-
把
node += d
,就把subtree_max += d, delta += d;
。 -
update 时,
subtree_max = max(left->subtree_max, right->subtree_max) + delta
每次查询时,累计祖先上的标记即可。
动态开点线段树合并
为保证复杂度,每次合并时不能 pushdown
开新点。
避免开点方法:
-
标记永久化。
-
如果节点没有左右儿子就不
pushdown
。