【笔记】线段树技巧学习笔记

标记永久化

一般情况下,因为一些原因线段树不能 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

posted @ 2021-10-08 13:41  Themaxmaxmax  阅读(30)  评论(1编辑  收藏  举报