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 }

 

posted @ 2012-08-12 15:11  某某。  阅读(206)  评论(0编辑  收藏  举报