HDU 1698

来源:互联网 发布:淘宝购物技巧 编辑:程序博客网 时间:2024/05/18 22:11

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


 线段树中的成段更新。 初始权值1-n为1.每次更新的时候判断一下是否找到当前要找的区间。如果找到直接返回。。没有找到就把当前这个大区间的权值改为0,表示子节点是由不同权值构成的!

下面是AC代码:

#include<cstdio>using namespace std;#define maxn 100010struct 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;     }     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);    }}


原创粉丝点击