首页 > 代码库 > 树状数组成段更新——POJ 3468
树状数组成段更新——POJ 3468
A Simple Problem with IntegersCrawling in process...Crawling failedTime Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。