单点更新
/* * @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 线段树与可持久化