A Simple Problem with IntegersCrawling in process...
Crawling failed
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<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<iostream> const int MAXN=100000+10; using namespace std; typedef long long LL; LL sum[MAXN]; LL c1[MAXN]; LL c2[MAXN]; int lowbit(int x) { return x&(-x); } void update(LL *c, int x, LL val) { while(x<=MAXN) { c[x]+=val; x+=lowbit(x); } } LL Sum(LL *c, int x) { LL res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } LL SUM(int x) { return sum[x]+(x+1)*Sum(c1,x)-Sum(c2,x); } int main() { //reopen("in.txt","r",stdin); int n,m; while(scanf("%d%d", &n,&m)==2) { memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); int i,j,k; for(i=1; i<=n; i++){ scanf("%d", &j); sum[i]=sum[i-1]+j; } char ch[3]; while(m--) { scanf("%s", ch); if(ch[0]=='Q'){ scanf("%d%d", &i,&j); LL ans=SUM(j)-SUM(i-1); printf("%I64d\n", ans); } else{ scanf("%d%d%d", &i,&j,&k); update(c1,i,k); update(c1,j+1,-k); update(c2,i,i*k); update(c2,j+1,-k*(j+1)); } } } return 0; }
树状数组成段更新——POJ 3468