HDU 1698 Just a Hook(改变区间的变形)
调试了好一会。。把模版上的lz标记,如何满足题意就OK了。。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 100001 5 int p[4*N],lz[4*N]; 6 void pushup(int rt) 7 { 8 p[rt] = p[rt<<1]+p[rt<<1|1]; 9 } 10 void pushdown(int rt,int m) 11 { 12 if(lz[rt]) 13 { 14 lz[rt<<1] = lz[rt]; 15 lz[rt<<1|1] = lz[rt]; 16 p[rt<<1] = lz[rt]*(m - (m>>1)); 17 p[rt<<1|1] = lz[rt]*(m>>1); 18 lz[rt] = 0; 19 } 20 } 21 void build(int l,int r,int rt) 22 { 23 int m; 24 lz[rt] = 0; 25 if(l == r) 26 { 27 p[rt] = 1; 28 return ; 29 } 30 m = (l+r) >> 1; 31 build(l,m,rt<<1); 32 build(m+1,r,rt<<1|1); 33 pushup(rt); 34 } 35 void update(int L,int R,int l,int r,int rt,int sc) 36 { 37 int m; 38 if(l >= L&&r <= R) 39 { 40 lz[rt] = sc; 41 p[rt] = sc*(r-l+1); 42 return ; 43 } 44 pushdown(rt,r-l+1); 45 m = (l + r) >> 1; 46 if(L <= m) 47 update(L,R,l,m,rt<<1,sc); 48 if(R > m) 49 update(L,R,m+1,r,rt<<1|1,sc); 50 pushup(rt); 51 } 52 int query(int L,int R,int l,int r,int rt) 53 { 54 int m,sum = 0; 55 if(l >= L&&r <= R) 56 { 57 return p[rt]; 58 } 59 pushdown(rt,r-l+1); 60 m = (l+r) >> 1; 61 if(L <= m) 62 sum += query(L,R,l,m,rt<<1); 63 if(R > m) 64 sum += query(L,R,m+1,r,rt<<1|1); 65 return sum; 66 } 67 int main() 68 { 69 int n,m,i,t,num = 0,x,y,z; 70 scanf("%d",&t); 71 while(t--) 72 { 73 num ++; 74 scanf("%d",&n); 75 build(1,n,1); 76 scanf("%d",&m); 77 for(i = 1;i <= m;i ++) 78 { 79 scanf("%d%d%d",&x,&y,&z); 80 update(x,y,1,n,1,z); 81 } 82 printf("Case %d: The total value of the hook is %d.\n",num,query(1,n,1,n,1)); 83 } 84 return 0; 85 }