线段树与可持久化

  

单点更新

/*   * @Author: qin_peng   * @Date: 2018-08-20 23:22:08   * @Last修改:qin_peng   * @Last修改时间:2018-08-29 23:22:34   */# include<比特/stdc + + .h>   使用名称空间性病;   typedef很久噢;   类型定义无符号长长妳;   #定义lson l, m, rt<& lt; 1   #定义rson m + 1, r, rt<& lt; 1 | 1   const int maxn=55555;   int和(maxn<& lt; 2)={0};   空白俯卧撑(int rt){总和(rt)=[rt<& lt; 1]总和+总和[rt<& lt; 1 | 1];}   无效的构建(int, int, int rt)   {   如果(l==r) {scanf (“% d”,和sum (rt));回归;}   int m=(l + r)在祝辞1;   构建(lson),构建(rson);   俯卧撑(rt);   }   无效的更新(pos int, int val, int, int, int rt)   {   如果r (l==)   {   总和(rt) +=val;回归;   }   int m=(l + r)在祝辞1;   如果(pos<=m)更新(pos, val, lson);   其他更新(pos val, rson);俯卧撑(rt);   }   int查询(int, int, int, int, int rt)   {   如果(L米)res +=(L, R, rson);   返回res;   }

区间更新

# include<比特/stdc + + .h>   使用名称空间性病;   typedef很久噢;   类型定义无符号长长妳;   #定义lson l, m, rt<& lt; 1   #定义rson m + 1, r, rt<& lt; 1 | 1   const int maxn=200005;   我总和[maxn<& lt; 2 | 1]={0};   我添加[maxn<& lt; 2 | 1]={0};   空白俯卧撑(int rt){总和(rt)=[rt<& lt; 1]总和+总和[rt<& lt; 1 | 1];}   无效的叠加(int rt, int米)   {   如果(添加(rt))   {   添加[rt<& lt; 1] +=添加(rt);   添加(rt<& lt; 1 | 1) +=添加(rt);   和[rt<& lt; 1] +=添加(rt) * (m - (, m>的在1));   总和(rt<& lt; 1 | 1) +=添加(rt) * (m>在1);   添加(rt)=0;   }   }   无效的构建(int, int, int rt)   {   如果(l==r) {scanf (“% lld, sum (rt));回归;}   int m=(l + r)在祝辞1;   构建(lson),构建(rson);   俯卧撑(rt);   }   无效的更新(int, int, int val, int, int, int rt)   {   如果(l> L和r<==R)   {   添加(rt) +=val;   总和(rt) +=(ll) val * (rl + 1);回归;   }   下推(rt, rl + 1);   int m=(l + r)在祝辞1;   如果(L<=m)更新(L, R, val, lson);   如果(m=r)返回(rt)总和;   下推(rt, rl + 1);   int m=(l + r)在祝辞1;   将res=0;   如果查询(m>=L) res +=(L, R, lson);   如果查询(m

区间合并

# include<比特/stdc + + .h>   使用名称空间性病;   typedef很久噢;   类型定义无符号长长妳;   #定义根1,n, 1   #定义lson l, m, rt<& lt; 1   #定义rson m + 1, r, rt<& lt; 1 | 1   const int e4 N=5 + 10;   int lsum N<& lt; 2, rsum (N<& lt; 2) [N], N,问;   空白push_up (int rt, int米)   {   lsum (rt)=lsum [rt<& lt; 1];   rsum (rt)=rsum [rt<& lt; 1 | 1];   如果(lsum [rt<& lt; 1]==m - (, m>的在1)lsum (rt) +=lsum [rt<& lt; 1 | 1];   如果(rsum [rt<& lt; 1 | 1]==m>在1)rsum (rt) +=rsum [rt<& lt; 1];   }   无效的构建(int, int, int rt)   {   lsum (rt)=rsum (rt)=rl + 1;   如果(l==r)返回;   ,int m=l + r>的在1;   构建(lson),构建(rson);   }   无效的更新(int, int val, int, int, int rt)   {   如果(l==r) {lsum (rt)=rsum (rt)=val;回归;}   ,int m=l + r>的在1;   如果(术中;=m)更新(p, val, lson);   其他更新(p, val, rson);   push_up (rt, rl + 1);   }   int查询(int, int, int, int rt)   {   如果(l==r)返回0;   int m=l + r祝辞祝辞1;   如果(p>=m-rsum [rt<& lt; 1] + 1,及术中;=m + lsum [rt<& lt; 1 | 1])   返回rsum [rt<& lt; 1] + lsum [rt<& lt; 1 | 1];   如果(术中;=m)返回查询(p, lson);   否则返回查询(p, rson);   }

经典染色

# include   # include   # include   # include   # include   #定义MAXN 40010   #定义x3f3f3f3f正0   使用名称空间性病;   李int [MAXN];   int ri (MAXN);   int lisan (MAXN<& lt; 2);   int树(MAXN<& lt; 2);   int vis (MAXN<& lt; 2);   int答;   无效的叠加(int p)   {   树树[术;& lt; 1]=[(术中;& lt; 1) | 1]=[p]树;   树[p]=1;   }   无效更新(int, int, int, int x, int y, int)   {   如果(x

线段树与可持久化