HDOJ 1698 Just a Hook

1、本题是线段树的区间修改及维护。。。发现线段树还是比较灵活的,关键在于maintain函数,一定要注意。

2、听说tourist做了1W+题目,还是相当震惊的。。。

#include<cstdio>

#include<cstring>
using namespace std;
const int maxn=100010;
int t[4*maxn],setv[4*maxn],v;
void pushdown(int o){
if(setv[o]>=0){
setv[o*2]=setv[o*2+1]=setv[o];
setv[o]=-1;
}
}
void build(int o,int L,int R){
int M=(L+R)/2;
if(L==R){
t[o]=1;
return;
}
build(2*o,L,M);
build(2*o+1,M+1,R);
t[o]=t[o*2]+t[o*2+1];
}
void maintain(int o,int L,int R){
if(setv[o]>0)
        t[o]=setv[o]*(R-L+1);
else if(R>L)
t[o]=t[o*2]+t[o*2+1];
}
void update(int o,int L,int R,int y1,int y2){
if(y1<=L && R<=y2){
setv[o]=v;
}else{
pushdown(o);
int M=(L+R)/2;
if(y1<=M) update(o*2,L,M,y1,y2);
else maintain(o*2,L,M);
if(y2>M) update(o*2+1,M+1,R,y1,y2);
else maintain(o*2+1,M+1,R);
}
maintain(o,L,R);
}
int n,m;
int main(){
int T,x,y,z;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++){
         scanf("%d%d",&n,&m);
         build(1,1,n);
memset(setv,-1,sizeof(setv));
while(m--){
scanf("%d%d%d",&x,&y,&z);
v=z;
update(1,1,n,x,y);
}
printf("Case %d: The total value of the hook is %d.\n",kase,t[1]);  
}
return 0;
}
posted @ 2014-08-17 20:06  深蓝色的猫  阅读(100)  评论(0)    收藏  举报