线段树成段更新
2013-10-27 19:23
113 查看
http://poj.org/problem?id=3468
代码:
View Code
代码:
#include<stdio.h> #include<string.h> #define maxn 100010 struct node { int l,r; __int64 sum,p; }tree[maxn*4]; __int64 value[maxn]; void build(int l,int r,int v) { tree[v].l=l; tree[v].r=r; tree[v].p=0; if(l==r) { tree[v].sum=value[l]; return ; } int mid=(tree[v].l+tree[v].r)/2; build(l,mid,v*2); build(mid+1,r,v*2+1); tree[v].sum=tree[v*2].sum+tree[v*2+1].sum; } void update(int l,int r,__int64 c,int v) { if(tree[v].l==l&&tree[v].r==r) { tree[v].p+=c; return ; } tree[v].sum+=(r-l+1)*c; int mid=(tree[v].l+tree[v].r)/2; if(r<=mid) update(l,r,c,v*2); else if(l>mid) update(l,r,c,v*2+1); else { update(l,mid,c,v*2); update(mid+1,r,c,v*2+1); } } __int64 query(int l,int r,int v) { __int64 t=tree[v].p; if(l==tree[v].l&&tree[v].r==r) return tree[v].sum+t*(r-l+1); else { tree[2*v].p+=tree[v].p; tree[2*v+1].p+=tree[v].p; tree[v].sum+=(tree[v].r-tree[v].l+1)*t; tree[v].p=0; } int mid=(tree[v].l+tree[v].r)/2; if(r<=mid) return query(l,r,v*2); else if(l>mid) return query(l,r,v*2+1); else return (query(l,mid,v*2)+query(mid+1,r,v*2+1)); } int main() { //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%I64d",&value[i]); build(1,n,1); while(m--) { char ch[3]; int a,b; __int64 c; scanf("%s",ch); if(ch[0]=='Q') { scanf("%d%d",&a,&b); printf("%I64d\n",query(a,b,1)); } else { scanf("%d%d%I64d",&a,&b,&c); update(a,b,c,1); } } } return 0; }
View Code
相关文章推荐
- poj 3468 A Simple Problem with Integers(线段树)(第二部分 成段更新,区间求和)
- 线段树模板(二)——成段更新 + POJ 3468 A Simple Problem with Integers
- Wikioi 1081 线段树成段更新单点查询
- 线段树---成段更新hdu1698 Just a Hook
- POJ 2528 Mayor's posters(线段树成段更新+离散化)
- poj 3468 线段树 区间内的线段和(成段更新)
- poj 3468 A Simple Problem with Integers(线段树成段更新)
- Poj3468 线段树 -- 成段更新
- 线段树成段更新裸题POJ3468
- ZOJ 1610 Count the Colors (线段树 成段更新)
- POJ 3468 A Simple Problem with Integers(线段树 or 树状数组—区间求和,成段更新)
- FZU1608(线段树成段更新,区间求和pushdown延迟标记结构体版)
- hdu 4107 线段树 成段更新
- POJ 3667 Hotel 线段树 区间合并(成段更新)
- A Simple Problem with Integers----HDU_3468----线段树之成段更新
- zoj 2706 Thermal Death of the Universe(线段树成段更新)
- Codeforces #159 224 E E. XOR on Segment 二十几颗线段树 成段更新 成段求和
- HDU.1698 屠夫(线段树成段更新大大大水题)
- UESTC 1546 Bracket Sequence 线段树成段更新
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】