您的位置:首页 > 其它

poj 3468 A Simple Problem with Integers

2013-08-02 15:25 288 查看
链接:点击打开链接

有N个数,A1~An,有两种操作,C A B C代表A到B区间所有的数都加C,Q A B是求A到B区间的和,是一道简单的成段更新,懒惰记忆。记得用long long就行

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 100010
struct node{
int l;
int r;
long long sum;
long long num;
}anode[4*N];
int data
;
void bulid(int l,int r,int n){
int mid;
mid=(l+r)>>1;
anode
.num=0;
if(l==r){
anode
.l=l;
anode
.r=r;
anode
.sum=data[l];
}
else{
anode
.l=l;
anode
.r=r;
bulid(l,mid,2*n);
bulid(mid+1,r,2*n+1);
anode
.sum=anode[2*n].sum+anode[2*n+1].sum;
}
}
long long query(int l,int r,int n,long long m){
int mid;
mid=(anode
.l+anode
.r)>>1;
if(anode
.l==l&&anode
.r==r){

return anode
.sum+(r-l+1)*m;
}
if(r<=mid)
return query(l,r,2*n,m+anode
.num);
else if(l>mid)
return query(l,r,2*n+1,m+anode
.num);
else
return query(l,mid,2*n,m+anode
.num)+query(mid+1,r,2*n+1,m+anode
.num);
}
void update(int l,int r,int n,int m){
int mid;
mid=(anode
.l+anode
.r)>>1;
anode
.sum+=(r-l+1)*m;
if(anode
.l==l&&anode
.r==r){
anode
.num+=m;
return;
}
if(r<=mid)
update(l,r,2*n,m);
else if(l>mid)
update(l,r,2*n+1,m);
else{
update(l,mid,2*n,m);
update(mid+1,r,2*n+1,m);
}
}
int main(){
int n,q,a,b,c,i;
char str;
while(~scanf("%d %d",&n,&q)){
for(i=1;i<=n;i++)
scanf("%d",&data[i]);
bulid(1,n,1);
//getchar();
while(q--){
getchar();
scanf("%c",&str);
if(str=='Q'){
scanf("%d %d",&a,&b);
printf("%lld\n",query(a,b,1,0));
}
else if(str=='C'){
scanf("%d %d %d",&a,&b,&c);
update(a,b,1,c);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: