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 }
posted @ 2012-08-10 17:30  Naix_x  阅读(167)  评论(0编辑  收藏  举报