线段树成段更新

来源:互联网 发布:邮箱搜索软件 编辑:程序博客网 时间:2024/06/03 02:27

hdu 1698

http://acm.hdu.edu.cn/showproblem.php?pid=1698

成段更新求和


#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define MAX 100100#define mid (l+r)>>1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int num[MAX<<2];int add[MAX<<2];int n,m;void pushup(int rt){num[rt]=num[rt<<1]+num[rt<<1|1];}void build(int l,int r,int rt){add[rt]=0;num[rt]=1;if(l==r){return;}int m=mid;build(lson);build(rson);pushup(rt);}void pushdown(int m,int rt){if(add[rt]){add[rt<<1]=add[rt<<1|1]=add[rt];num[rt<<1]=(m-(m>>1))*add[rt];num[rt<<1|1]=(m>>1)*add[rt];add[rt]=0;}}void Updata(int L,int R,int c,int l,int r,int rt){if(L<=l && R>=r){add[rt]=c;num[rt]=(r-l+1)*c;return;}int m=mid;pushdown(r-l+1,rt);if(L<=m) Updata(L,R,c,lson);if(R>m) Updata(L,R,c,rson);pushup(rt);}int main(){int t;int flag=0;scanf("%d",&t);while(t--){++flag;cin>>n>>m;build(1,n,1);for(int i=1; i<=m; i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);Updata(a,b,c,1,n,1);}printf("Case %d: The total value of the hook is %d.\n",flag,num[1]);}return 0;}

poj 3468

http://poj.org/problem?id=3468

成段更新,成段查询

#include <iostream>#include <cstdio>#include <cstring>#define MAX 100100using namespace std;#define mid (l+r)>>1#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1long long sum[MAX<<2],add[MAX<<2];int n,m;void pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){add[rt]=0;if(l==r){scanf("%lld",&sum[rt]);return;}int m=mid;build(lson);build(rson);pushup(rt);}void pushdown(int m,int rt){if(add[rt]){add[rt<<1]+=add[rt];add[rt<<1|1]+=add[rt];sum[rt<<1]+=(m-(m>>1))*add[rt];sum[rt<<1|1]+=(m>>1)*add[rt];add[rt]=0;}}void updata(int L,int R,int p,int l,int r,int rt){if(L<=l && R>=r){add[rt]+=(long long)p;sum[rt]+=(r-l+1)*(long long)p;return;}pushdown(r-l+1,rt);int m=mid;if(L<=m) updata(L,R,p,lson);if(R>m) updata(L,R,p,rson);pushup(rt);}long long query(int L,int R,int l,int r,int rt){if(L<=l && R>=r){return sum[rt];}pushdown(r-l+1,rt);int m=mid;long long ret=0;if(L<=m) ret+=query(L,R,lson);if(R>m) ret+=query(L,R,rson);return ret;}int main(){while(scanf("%d%d",&n,&m)!=EOF){build(1,n,1);for(int i=1; i<=m; i++){char ch[2];int a,b,c;scanf("%s%d%d",ch,&a,&b);if(ch[0]=='Q') printf("%lld\n",query(a,b,1,n,1));else scanf("%d",&c),updata(a,b,c,1,n,1);}}return 0;}