HDU1698 Just a Hook--线段树LAZY操作

来源:互联网 发布:汤不热类似的软件 编辑:程序博客网 时间:2024/06/05 22:53
#include <iostream>  #include <cstdio>  #include <cmath>  #include <algorithm>  using namespace std;  #define ll long long  #define FOR( i , a , b ) for ( int i = a ; i <= b ; ++ i )  #define Mid ((l+r)>>1)  #define lson rt<<1,l,Mid  #define rson rt<<1|1,Mid+1,r  const int maxn = 100010;  int sum[maxn<<2],add[maxn<<2];        void build(int rt,int l,int r){      add[rt] = 0;      if(l == r)        sum[rt] = 1;      else{          build(lson);          build(rson);          sum[rt]=sum[rt<<1]+sum[rt<<1|1];      }  }        void pushDown(int rt,int len){      add[rt<<1] = add[rt<<1|1] = add[rt];      sum[rt<<1] = (len-(len>>1))*add[rt];      sum[rt<<1|1] = (len>>1)*add[rt];      add[rt] = 0;  }        void update(int rt,int l,int r,int L,int R,int z){      if(L <= l && r <= R){          add[rt] = z;          sum[rt] = (r-l+1)*z;      }else{          if(add[rt])              pushDown(rt,r-l+1);          if(L <= Mid)              update(lson,L,R,z);          if(R > Mid)              update(rson,L,R,z);          sum[rt] = sum[rt<<1] + sum[rt<<1|1];      }  }        int main(){          int t,n,q,x,y,z;      int cnt=1;      scanf("%d",&t);      while(t--){          scanf("%d%d",&n,&q);          build(1,1,n);          while(q--){              scanf("%d%d%d",&x,&y,&z);              update(1,1,n,x,y,z);          }          printf("Case %d: The total value of the hook is %d.\n", cnt++,sum[1]);      }      return 0;  }  

原创粉丝点击