POJ 3468 A Simple Problem with Integers(线段树成段更新)

来源:互联网 发布:格罗兹尼巷战 知乎 编辑:程序博客网 时间:2024/09/21 06:18

题意很好理解...

这题增量要用int64..增量可以为负...小心数据类型溢出...感觉自己写的lazy操作有点挫...应该说是搓成渣了....

不过能AC就好...WA了好多次 干脆都全部换成int64才过了....坑爹的题目

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<iostream>using namespace std;struct node{__int64 l,r,x;__int64 sum;}data[600200];void build(__int64 l,__int64 r,__int64 k){data[k].l=l;data[k].r=r;data[k].x=0;if(l==r){scanf("%I64d",&data[k].sum);return ;}__int64 mid=(l+r)/2;build(l,mid,k<<1);build(mid+1,r,k<<1|1);data[k].sum=data[k<<1].sum+data[k<<1|1].sum;}void updata(__int64 l,__int64 r,__int64 k,__int64 add){if(data[k].l==l&&data[k].r==r){data[k].sum+=(__int64)add*(r-l+1);data[k].x+=add;return ;}__int64 mid=(data[k].l+data[k].r)/2;updata(data[k].l,mid,k*2,data[k].x);updata(mid+1,data[k].r,k*2+1,data[k].x);data[k].x=0;data[k].sum+=(r-l+1)*add;if(l>mid)updata(l,r,k*2+1,add);else if(r<=mid)updata(l,r,k*2,add);else{updata(l,mid,k*2,add);updata(mid+1,r,k*2+1,add);}}__int64 query(__int64 l,__int64 r,__int64 k){if(data[k].l==l&&data[k].r==r||data[k].l==data[k].r)return data[k].sum;__int64 ret=0;__int64 mid=(data[k].l+data[k].r)/2;if(data[k].x){updata(data[k].l,mid,k*2,data[k].x);updata(mid+1,data[k].r,k*2+1,data[k].x);data[k].sum=data[k*2].sum+data[k*2+1].sum;data[k].x=0;}if(l>mid)ret+=query(l,r,k*2+1);else if(r<=mid)ret+=query(l,r,k*2);elseret+=query(l,mid,k*2)+query(mid+1,r,k*2+1);return ret;}int main(){__int64 n,q;scanf("%I64d %I64d",&n,&q);build(1,n,1);while(q--){char op[5];__int64 a,b,c;scanf("%s",op);if(op[0]=='Q'){scanf("%I64d %I64d",&a,&b);printf("%I64d\n",query(a,b,1));}else{scanf("%I64d %I64d %I64d",&a,&b,&c);updata(a,b,1,c);}}return 0;}


0 0
原创粉丝点击