hdu Just a Hook 线段树——成段操作 区域覆盖
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1698
大意:先输入一个t代表有t个案例,然后输入个数n代表一共有n个数,值为他们的编号1~n。然后输入q,代表q各更新,再输入a,b,c,代表把a_b的值全部改为c;然后求出所有的和。
View Code
1 #include <stdio.h> 2 #define maxn 100007*4 3 struct node 4 { 5 int sum; 6 int lazy; 7 }tr[maxn]; 8 void pushup(int rt) 9 { 10 tr[rt].sum = tr[rt<<1].sum+tr[rt<<1|1].sum; 11 } 12 void build(int l,int r,int rt) 13 { 14 if(l == r) 15 { 16 tr[rt].sum = 1; 17 tr[rt].lazy = 0; 18 return; 19 } 20 int m = (l+r)>>1; 21 build(l,m,rt<<1); 22 build(m+1,r,rt<<1|1); 23 pushup(rt); 24 return; 25 } 26 void pushdown(int rt,int len) 27 { 28 if(tr[rt].lazy) 29 { 30 tr[rt<<1].lazy = tr[rt<<1|1].lazy = tr[rt].lazy; 31 tr[rt<<1].sum = (len-(len>>1))*tr[rt].lazy; 32 tr[rt<<1|1].sum = (len>>1)*tr[rt].lazy; 33 tr[rt].lazy = 0; 34 } 35 } 36 void update(int lx,int rx,int l,int r,int val,int rt) 37 { 38 if(lx <= l && rx >= r)//只要在要求的区域内就改变。 39 { 40 tr[rt].sum = val*(r-l+1); 41 tr[rt].lazy = val; 42 return; 43 } 44 pushdown(rt,r-l+1); 45 int m = (l+r)>>1; 46 if(lx <= m) 47 update(lx,rx,l,m,val,rt<<1); 48 if(rx > m) 49 update(lx,rx,m+1,r,val,rt<<1|1); 50 pushup(rt); 51 return; 52 } 53 int main() 54 { 55 int cas,t,n,m,i,j; 56 scanf("%d",&t); 57 cas = 0; 58 while(t--) 59 { 60 cas++; 61 scanf("%d",&n); 62 build(1,n,1); 63 scanf("%d",&m); 64 int x,y,val; 65 while(m--) 66 { 67 scanf("%d %d %d",&x,&y,&val); 68 update(x,y,1,n,val,1); 69 } 70 printf("Case %d: The total value of the hook is %d.\n",cas,tr[1].sum); 71 } 72 return 0; 73 }