线段树模板
2015-02-05 18:11
288 查看
#include<stdio.h> #include<algorithm> #include<string.h> #define ll __int64 #define M 100007 using namespace std; struct node { ll l,r,mid,val,mark; }tree[M<<2]; ll s[M]; void build(ll left,ll right,ll i)//建树 { tree[i].l=left;tree[i].r=right; tree[i].mid=(left+right)>>1;tree[i].mark=0; if(left==right){tree[i].val=s[left]; return;} build(left,tree[i].mid,i*2); build(tree[i].mid+1,right,i*2+1); tree[i].val=tree[i*2].val+tree[i*2+1].val; } void update(int pos,ll val,int i)//点更新 { tree[i].val+=val; if(tree[i].l==tree[i].r)return; if(pos<=tree[i].mid)update(pos,val,i*2); else update(pos,val,i*2+1); } ll query(int left,int right,int i)//点查询 { if(tree[i].l==left&&tree[i].r==right)return tree[i].val; if(right<=tree[i].mid)query(left,right,i*2); else if(left>tree[i].mid)query(left,right,i*2+1); else return query(left,tree[i].mid,i*2)+query(tree[i].mid+1,right,i*2+1); } void update(int left,int right,ll val,int i)//区间更新 { if(tree[i].l==left&&tree[i].r==right){tree[i].mark+=val;return;} tree[i].val+=val*(right-left+1); if(tree[i].mid<left)update(left,right,val,2*i+1); else if(tree[i].mid>=right)update(left,right,val,2*i); else { update(left,tree[i].mid,val,2*i); update(tree[i].mid+1,right,val,2*i+1); } } ll query(int left,int right,int i)//区间查询 { if(tree[i].l==left&&tree[i].r==right) return tree[i].val+tree[i].mark*(right-left+1); if(tree[i].mark!=0) { tree[i*2].mark+=tree[i].mark;tree[i*2+1].mark+=tree[i].mark; tree[i].val+=(tree[i].r-tree[i].l+1)*tree[i].mark;tree[i].mark=0; } if(tree[i].mid>=right){return query(left,right,i*2);} else if(tree[i].mid<left){return query(left,right,i*2+1);} else{return query(left,tree[i].mid,i*2)+query(tree[i].mid+1,right,i*2+1);} } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%I64d",&s[i]); build(0,M,1); ...... } return 0; }
相关文章推荐
- 简单树刨+线段树模板 877E - Danil and a Part-time Job
- 线段树模板
- 【线段树模板!!!】hdu-1394 顺便学习一下not only succes 的线段树风格
- 【模板】可持久化线段树
- 线段树 自己总结的模板
- luogu P3834 【模板】可持久化线段树 1(主席树)
- 线段树模板 (poj 3468)延迟标记
- 模板:线段树求区间最大/最小值及下标
- 模板:线段树(1)点修改
- 【模板】线段树
- HDU-1166 敌兵布阵(线段树模板题)
- hdu1754 I hate it线段树模板 区间最值查询
- 线段树的模板(更新ing)
- 线段树详解+模板
- P3373 【模板】线段树 2 区间求和 区间乘 区间加
- Mosaic HDU - 4819 二维线段树 模板
- HDU - 3577 Fast Arrangement (线段树区间修改及查询模板题)
- 【hdu1754】I Hate It——线段树模板题
- 【线段树模板】
- (模板)线段树 (区间更新,区间求和)