kb-07线段树-05-区间整体修改查询;(水)
1 /* 2 3 4 */ 5 #include<iostream> 6 #include<cstring> 7 #include<cstdio> 8 using namespace std; 9 struct P 10 { 11 int l,r,value; 12 int add; 13 }tr[400005]; 14 void Pushup(int rt) 15 { 16 tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value; 17 } 18 void build(int rt,int l,int r) 19 { 20 tr[rt].l=l; 21 tr[rt].r=r; 22 tr[rt].add=0; 23 if(l==r) 24 { 25 tr[rt].value=1; 26 return ; 27 } 28 int mid=(l+r)/2; 29 build(rt<<1,l,mid); 30 build(rt<<1|1,mid+1,r); 31 Pushup(rt); 32 } 33 /* 34 区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求; 35 */ 36 void Pushdown(int rt) 37 { 38 if(tr[rt].add<=0) 39 return ; 40 tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1); 41 tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1); 42 tr[rt<<1].add=tr[rt].add; 43 tr[rt<<1|1].add=tr[rt].add; 44 tr[rt].add=0; 45 } 46 void Update(int rt,int l,int r,int begin,int end,int x) 47 { 48 if(begin<=l&&end>=r) 49 { 50 tr[rt].add=x; 51 tr[rt].value=x*(r-l+1);//把区间更新成x 52 return ; 53 } 54 Pushdown(rt); 55 if(begin <=tr[rt<<1].r) 56 { 57 Update(rt<<1,l,tr[rt<<1].r,begin,end,x); 58 } 59 if(end >=tr[rt<<1|1].l) 60 { 61 Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x); 62 } 63 Pushup(rt);//区间下面的值发生变化,所以要pushup 64 65 } 66 int main() 67 { 68 int T,k=1; 69 scanf("%d",&T); 70 while(T--) 71 { 72 int n,q; 73 scanf("%d%d",&n,&q); 74 memset(tr,0,sizeof(tr)); 75 build(1,1,n); 76 for(int i=0;i<q;i++) 77 { 78 int ll,rr,v; 79 scanf("%d%d%d",&ll,&rr,&v); 80 Update(1,1,n,ll,rr,v); 81 // for(int j=1;j<=25;j++) 82 // printf("%d:%d\n",j,tr[j].value); 83 } 84 int ans=tr[1].value; 85 printf("Case %d: The total value of the hook is %d.\n",k++,ans); 86 } 87 return 0; 88 }