SGTtrick
B y 蒟 蒻 l d x o i By\ 蒟蒻\ ldxoi By 蒟蒻 ldxoi
Chapter 1.关于线段树操作的一些分析
我们知道,线段树有两个核心的函数 p u s h d o w n pushdown pushdown和 p u s h u p pushup pushup。
以及两类对于一段区间进行操作的函数 u p d a t e update update和 q u e r y query query
博主在这里简单讲一下几个函数的功能:
首先我们假设用 V a l Val Val表示维护信息的类型, T a g Tag Tag表示懒标记的类型。
显然一个线段树节点(类型为 N o d e Node Node)是由一个 V a l Val Val元素和一个 T a g Tag Tag以及表示区间管辖范围的 l , r l,r l,r构成的。
struct Tag{
...};
struct Val{
...};
struct Node{
Val val;Tag tag;int l,r;}T[N<<2];
- p u s h d o w n ( i n t p ) pushdown(int\ p) pushdown(int p)表示将 p p p的标记下传给 p p p的儿子并更新它们的信息和标记
- p u s h u p ( i n t p ) pushup(int\ p) pushup(int p)表示把 p p p儿子的信息合并成 p p p的信息
- q u e r y ( i n t p , i n t q l , i n t q r ) query(int\ p,int\ ql,int\ qr) query(int p,int ql,int qr)表示查询区间 [ q l , q r ] [ql,qr] [ql,qr]的一些信息
- u p d a t e ( i n t p , i n t q l , i n t q r , T a g v ) update(int\ p,int\ ql,int\ qr,Tag\ v) update(int p,int ql,int qr,Tag v)表示用标记 v v v对区间 [ q l , q r ] [ql,qr] [ql,qr]的信息和标记进行更新
可以看出来这些函数分成两类:
- 父亲朝儿子转移: u p d a t e , p u s h d o w n update,pushdown update,pushdown
- 儿子朝父亲转移: q u