HDU 1698---线段树

线段树成段更新模板题。。

题意:

给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。

代码:

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define maxn 100100
 5 #define lson l,m,rt<<1
 6 #define rson m+1,r,rt<<1|1
 7 int sum[maxn<<2],flag[maxn<<2];
 8 void Pushup(int rt)
 9 {
10     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
11 }
12 void Pushdown(int rt,int num)
13 {
14     if(flag[rt])
15     {
16         flag[rt<<1]=flag[rt<<1|1]=flag[rt];
17         sum[rt<<1]=(num-(num>>1))*flag[rt];
18         sum[rt<<1|1]=(num>>1)*flag[rt];
19         flag[rt]=0;
20     }
21 }
22 void build(int l,int r,int rt)
23 {
24     if(l==r)
25     {
26         sum[rt]=1;
27         return;
28     }
29     flag[rt]=0;
30     int m=(l+r)>>1;
31     build(lson);
32     build(rson);
33     Pushup(rt);
34 }
35 void update(int L,int R,int add,int l,int r,int rt)
36 {
37     if(L<=l&&r<=R)
38     {
39         flag[rt]=add;
40         sum[rt]=(r-l+1)*add;
41         return;
42     }
43     Pushdown(rt,r-l+1);
44     int m=(l+r)>>1;
45     if(L<=m) update(L,R,add,lson);
46     if(R>m) update(L,R,add,rson);
47     Pushup(rt);
48 }
49 int main()
50 {
51     int t,cas=1,L,R,add,m,n;
52     while(~scanf("%d",&t))
53     {
54         while(t--)
55         {
56             scanf("%d",&n);
57             build(1,n,1);
58             scanf("%d",&m);
59             while(m--)
60             {
61                 scanf("%d %d %d",&L,&R,&add);
62                 update(L,R,add,1,n,1);
63             }
64             printf("Case %d: The total value of the hook is %d.\n",cas++,sum[1]);
65         }
66     }
67     return 0;
68 }
复制代码

 

posted on 2013-02-07 21:47  acoderworld  阅读(86)  评论(0)    收藏  举报

< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示