C - A Simple Problem with Integers POJ 3468(线段树+延迟标记)
来源:互联网 发布:市川海老藏 知乎 编辑:程序博客网 时间:2024/06/05 05:13
C - A Simple Problem with Integers
Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u
Submit Status Practice POJ 3468
Description
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C abc" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q ab" means querying the sum of Aa, Aa+1, ... , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
//线段树 的区间更新,用好延迟标记
//#include<bits/stdc++.h>#include<cstdio>#include<algorithm>using namespace std;const int maxn=500011;const int inf=999999999;#define lson (rt<<1),L,M#define rson (rt<<1|1),M+1,R#define M ((L+R)>>1)#define For(i,n) for(int i=0;i<(n);i++)template<class T>inline T read(T&x){ char c; while((c=getchar())<=32); bool ok=false; if(c=='-')ok=true,c=getchar(); for(x=0; c>32; c=getchar()) x=x*10+c-'0'; if(ok)x=-x; return x;}template<class T> inline void read_(T&x,T&y){ read(x); read(y);}template<class T> inline void write(T x){ if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0');}template<class T>inline void writeln(T x){ write(x); putchar('\n');}//-------IO template------typedef __int64 LL;struct node{ LL sum; LL inv; node(){sum=0;inv=0;}}p[maxn<<2];void build(LL rt,LL L,LL R){ if(L==R) { scanf("%I64d",&p[rt].sum);//read(p[rt].sum); return; } build(lson); build(rson); p[rt].sum=p[rt<<1].sum+p[rt<<1|1].sum;}void update(LL rt,LL L,LL R,LL x,LL y,LL add){ if(L==x&&R==y) { p[rt].inv+=add; p[rt].sum+=(LL)add*(R-L+1); return; } if(p[rt].inv)///p[rt].inv可能收负数,之前写成了p[rt].inv>0 导致WA很多次 { p[rt<<1].inv+=p[rt].inv; p[rt<<1|1].inv+=p[rt].inv; p[rt<<1].sum+=(LL)p[rt].inv*(M-L+1); p[rt<<1|1].sum+=(LL)p[rt].inv*(R-M); p[rt].inv=0; } if(y<=M) update(lson,x,y,add); else if(x>M) update(rson,x,y,add); else{ update(lson,x,M,add); update(rson,M+1,y,add); } p[rt].sum=p[rt<<1].sum+p[rt<<1|1].sum;}LL query(LL rt,LL L,LL R,LL x,LL y){ if(x==L&&y==R) { return p[rt].sum;//+p[rt].inv*(R-L+1); } if(p[rt].inv) { p[rt<<1].inv+=p[rt].inv; p[rt<<1|1].inv+=p[rt].inv; p[rt<<1].sum+=(LL)p[rt].inv*(M-L+1); p[rt<<1|1].sum+=(LL)p[rt].inv*(R-M); p[rt].inv=0; } if(y<=M) return query(lson,x,y); else if(x>M) return query(rson,x,y); else return query(lson,x,M)+query(rson,M+1,y);}int main(){ //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif // ONLINE_JUDGE LL m,n,i,j,k,t; while(~scanf("%I64d%I64d",&n,&m)) { build(1,1,n); char op[2]; while(m--) { LL x,y; scanf("%s",op);scanf("%I64d%I64d",&x,&y); if(op[0]=='Q') { printf("%I64d\n",query(1,1,n,x,y)); } else{ LL z; scanf("%I64d",&z); update(1,1,n,x,y,z); } } } return 0;}
0 0
- C - A Simple Problem with Integers POJ 3468(线段树+延迟标记)
- Poj 3468 A Simple Problem with Integers(线段树 区间更新 延迟标记)
- poj 3468 A Simple Problem with Integers(线段树+延迟标记)
- POJ 3468 A Simple Problem with Integers(线段树,延迟标记)
- POJ 3468 A Simple Problem with Integers(线段树 ,延迟标记)
- poj 3468 A Simple Problem with Integers(线段树成段更新,延迟标记,Lazy)
- POJ 3468 线段树成段更新区间求和 + 延迟标记详解 A Simple Problem with Integers
- POJ 3468A Simple Problem with Integers(线段树 + Lazy Tag(延迟更新))
- poj 3468 A Simple Problem with Integers(线段树、延迟更新)
- [ACM] poj 3468 A Simple Problem with Integers(线段树,成段更新,懒惰标记)
- POJ 3468-A Simple Problem with Integers(线段树_区间更新+lazy标记)
- 【线段树】A Simple Problem with Integers(区间查询和延迟标记)
- POJ 3468 A SIMPLE PROBLEM WITH INTEGERS(线段树)
- poj 3468 A Simple Problem with Integers ( 线段树 )
- POJ 3468 A Simple Problem with Integers (线段树)
- POJ 3468 A Simple Problem with Integers(线段树)
- poj 3468 A Simple Problem with Integers(线段树)
- POJ 3468-A Simple Problem with Integers(线段树)
- hdu 1175 连连看
- 33-语言入门-33-盗梦空间
- 微软2015实习第二题Professor Q's Software
- hdu 1556 Color the ball 树状数组
- [Leetcode] 101. Symmetric Tree
- C - A Simple Problem with Integers POJ 3468(线段树+延迟标记)
- 【hadoop】 2007-远程debug
- Sky Code - POJ 3904 容斥原理
- 用单例封装Core Data中的MO
- 解决win8.1无线网络受限问题
- 最近的一些思考,感悟和理解。
- 《暗时间》
- 【末世旅行之Java】this关键字的学习
- Leetcode: Construct Binary Tree from Inorder and Postorder Traversal