HDU 1698
线段树中的成段更新。 初始权值1-n为1.每次更新的时候判断一下是否找到当前要找的区间。如果找到直接返回。。没有找到就把当前这个大区间的权值改为0,表示子节点是由不同权值构成的!
下面是AC代码:
[cpp]
#include<cstdio>
using namespace std;
#define maxn 100010
struct node{
int id,l,r,m;
int val;
}T[maxn<<2];
void build(int id,int l,int r){
T[id].id = id ; T[id].l = l ; T[id].r = r; T[id].val=1;
T[id].m=(l+r)>>1;
if(l==r) return;
int m=(l+r)>>1; build(id<<1,l,m); build((id<<1)+1,m+1,r);
}
void update(int id,int l,int r,int val){
if(T[id].l==l&&T[id].r==r){
T[id].val=val; return;
} www.zzzyk.com
if(T[id].val>0){
T[id<<1].val=T[(id<<1)+1].val=T[id].val;
T[id].val=0;
}
if(T[id].m>=r) update(id<<1,l,r,val);
else if(T[id].m<l) update((id<<1)+1,l,r,val);
else{
update(id<<1,l,T[id].m,val);
update((id<<1)+1,T[id].m+1,r,val);
}
}
int count(int id){
if(T[id].val==0){
return count(id<<1)+count((id<<1)+1);
}
else{
return (T[id].r-T[id].l+1)*T[id].val;
}
}
int main(){
int t,ca=1,n,Q,x,y,val; scanf("%d",&t);
while(t--){
scanf("%d",&n); build(1,1,n);
scanf("%d",&Q);
while(Q--){
scanf("%d%d%d",&x,&y,&val);
update(1,x,y,val);
}
int ans=count(1);
printf("Case %d: The total value of the hook is ",ca++);
printf("%d.\n",ans);
}
}
补充:软件开发 , C++ ,