#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <set> #include <map> #include <queue> #include <string> #define maxn 8080 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ALL %I64d using namespace std; typedef long long ll; //线段树的定义 struct segment { int l,r; int value; int nv; } son[maxn<<2]; //PushUP函数 void PushUp(int rt) { son[rt].value=son[rt<<1].value+son[rt<<1|1].value; } //PushDown函数 void PushDown(int rt) { if(son[rt].nv) { son[rt<<1].nv+=son[rt].nv; son[rt<<1|1].nv+=son[rt].nv; //son[rt<<1].value+=(son[rt<<1].r-son[rt<<1].l+1)*son[rt].nv; //son[rt<<1|1].value+=(son[rt<<1|1].r-son[rt<<1|1].l+1)*son[rt].nv; son[rt].nv=0; } } //建立线段树 void Build(int l,int r,int rt) { son[rt].l=l; son[rt].r=r; if(l==r) { son[rt].value=1; return; } int m=(l+r)/2; Build(lson); Build(rson); PushUp(rt); } //线段树单点更新 void Update_1(int p,int value,int rt) { if(son[rt].l==son[rt].r) { son[rt].value=value; return; } PushDown(rt); int m=(son[rt].l+son[rt].r)/2; if(p<=m) Update_1(p,value,rt<<1); else Update_1(p,value,rt<<1|1); PushUp(rt); } //线段树区间更新 void Update_n(ll w,int l,int r,int rt) { if(son[rt].l==l&&son[rt].r==r) { son[rt].value+=w*(r-l+1); son[rt].nv+=w; return; } PushDown(rt); int m=(son[rt].l+son[rt].r)/2; if(r<=m) Update_n(w,l,r,rt<<1); else if(l>m) Update_n(w,l,r,rt<<1|1); else { Update_n(w,lson); Update_n(w,rson); } PushUp(rt); } //线段树插入位置查找并插入 int Update(int w,int rt) { if(son[rt].l==son[rt].r) { son[rt].value=0; return son[rt].l; } int m=(son[rt].l+son[rt].r)/2,ret=0; if(son[rt<<1].value>w) ret=Update(w,rt<<1); else { w-=son[rt<<1].value; ret=Update(w,rt<<1|1); } PushUp(rt); return ret; } //区间查询函数 ll Query(int l,int r,int rt) { if(son[rt].l==l&&son[rt].r==r) { return son[rt].value; } PushDown(rt); ll ret=0; int m=(son[rt].l+son[rt].r)/2; if(r<=m) ret=Query(l,r,rt<<1); else if(l>m) ret=Query(l,r,rt<<1|1); else { ret=Query(lson); ret+=Query(rson); } //PushUp(rt); return ret; } int main() { return 0; }
原文:http://blog.csdn.net/knight_kaka/article/details/38612075