hdu1698:
#include<cstdio> #define maxn 111111 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int sum[maxn<<2]; int col[maxn<<2]; void PushDown(int rt,int m) { if(col[rt]) { sum[rt<<1]=(m-(m>>1))*col[rt];//这里左儿子的区间长为m-(m>>1),左儿子是从l-(l+r)>>1,取较长的一段 sum[rt<<1|1]=(m>>1)*col[rt];//右儿子的区间长为m>>1 col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=0; } } void PushUp(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } //建树,每个节点默认为1,并且使用标记,标记了的区间才更新 void build(int l,int r,int rt) { sum[rt]=1;//每个节点都得设置 col[rt]=0; if(l==r) { return ; } int m=(l+r)>>1; build(lson); build(rson); PushUp(rt); } //每次更新时不用更新到底,利用col数组进行标记延迟更新 void Update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R)//不用更新到底,此时已经能求出更新后的和 { col[rt]=c; sum[rt]=(r-l+1)*c; return ; } PushDown(rt,r-l+1);//如果上次rt更过新,此时被访问时才更新 int m=(l+r)>>1; if(L<=m) Update(L,R,c,lson); if(R>m) Update(L,R,c,rson); PushUp(rt); } int main() { int t,n,m,x,y,z; scanf("%d",&t); for(int i=1; i<=t; i++) { scanf("%d%d",&n,&m); build(1,n,1); while(m--) { scanf("%d%d%d",&x,&y,&z); Update(x,y,z,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0; }
poj3468
#include<stdio.h> #define maxn 111111 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long ll sum[maxn<<2];//用long long型存 ll col[maxn<<2]; void pushUp(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushDown(int rt,int m) { if(col[rt]) { col[rt<<1]+=col[rt]; col[rt<<1|1]+=col[rt]; sum[rt<<1]+=(ll)col[rt]*(m-(m>>1)); sum[rt<<1|1]+=(ll)col[rt]*(m>>1); col[rt]=0; } } void build(int l,int r,int rt) { col[rt]=0; if(l==r) { scanf("%lld",&sum[rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); pushUp(rt); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R) { sum[rt]+=(ll)c*(r-l+1);//累加 col[rt]+=c; return ; } pushDown(rt,r-l+1);//更新和询问都需要向下更新 int m=(l+r)>>1; if(L<=m) update(L,R,c,lson); if(R>m) update(L,R,c,rson); pushUp(rt); } ll query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { return sum[rt]; } pushDown(rt,r-l+1); ll ret=0; int m=(l+r)>>1; if(L<=m) ret+=query(L,R,lson); if(R>m) ret+=query(L,R,rson); return ret; } int main() { int n,q,a,b,c; char s[2]; scanf("%d%d",&n,&q); build(1,n,1); for(int i=1;i<=q;i++) { scanf("%s",s); if(s[0]=='Q') { scanf("%d%d",&a,&b); printf("%lld\n",query(a,b,1,n,1)); } else { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } } return 0; }