您的位置:首页 > 其它

hdu 1698 Just a Hook 线段树区间更新

2014-03-17 11:42 411 查看
基本的线段更新(lazy标记)  线段树代码敲起来还是挺爽的

#include<stdio.h>

const int N=100005;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

int sum[N<<2],lazy[N<<2];

void push_up(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void push_down(int l,int r,int rt){
if(lazy[rt]){
int m=(l+r)>>1;
sum[rt<<1]=(m+1-l)*lazy[rt];
sum[rt<<1|1]=(r-m)*lazy[rt];
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];//don't forget
lazy[rt]=0;
}
}

void build(int l,int r,int rt){
lazy[rt]=0;
if(l==r){
sum[rt]=1;
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
push_up(rt);
}

void update(int a,int b,int c,int l,int r,int rt){
if(a<=l&&b>=r){
sum[rt]=(r+1-l)*c;
lazy[rt]=c;
return;
}
int m=(l+r)>>1;
push_down(l,r,rt);
if(a<=m)
update(a,b,c,lson);
if(b>m)
update(a,b,c,rson);
push_up(rt);
}

int query(int a,int b,int l,int r,int rt){
if(a<=l&&b>=r)
return sum[rt];
int m=(l+r)>>1,rst=0;
push_down(l,r,rt);
if(a<=m)
rst+=query(a,b,lson);
if(b>m)
rst+=query(a,b,rson);
return rst;
}

int main(){
int tt,cases=1,n,q,x,y,z;
scanf("%d",&tt);
while(tt--){
scanf("%d",&n);
build(1,n,1);
scanf("%d",&q);
while(q--){
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",cases++,sum[1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: