HDU 1698 Just a Hook 线段树 区间修改

题意:

一个区间编号为1到n,刚开始每个单位的值都为1,然后给出q个操作:u,v,w,把区间[u,v]的单位的值修改为w,问这q个操作后,总区间的值的和。

注意,这道题在输出的时候,我在最后忘了一个 ".",然后就wa了一次。

这个线段树有3个函数,pushup,pushdown,update,(build,query这道题可以省略)。

pushup:更新父亲节点的信息。

pushdown:把父亲节点的信息传递给子节点。

update:更新区间信息。

 1 #include<cstdio>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 const int maxn=100000+10;
 5 int setv[maxn<<2];
 6 int sum[maxn<<2];
 7 void pushup(int rt)
 8 {
 9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
10 }
11 void pushdown(int rt,int len)
12 {
13     if(setv[rt]>0){
14         setv[rt<<1]=setv[rt<<1|1]=setv[rt];
15         sum[rt<<1]=setv[rt<<1]*(len-(len>>1));
16         sum[rt<<1|1]=setv[rt<<1|1]*(len>>1);
17         setv[rt]=0;
18     }
19 }
20 void update(int L,int R,int p,int l,int r,int rt)
21 {
22     if(L<=l&&R>=r){
23         setv[rt]=p;
24         sum[rt]=p*(r-l+1);
25         return ;
26     }
27     pushdown(rt,r-l+1);
28     int m=(l+r)>>1;
29     if(L<=m)
30         update(L,R,p,lson);
31     if(R>m)
32         update(L,R,p,rson);
33     pushup(rt);
34 }
35 int main()
36 {
37     int test;
38     int cas=0;
39     scanf("%d",&test);
40     while(test--){
41         cas++;
42         int n,q;
43         scanf("%d",&n);
44         scanf("%d",&q);
45         setv[1]=1;
46         sum[1]=n;
47         int u,v,w;
48         for(int i=0;i<q;i++){
49             scanf("%d%d%d",&u,&v,&w);
50             update(u,v,w,1,n,1);
51         }
52         printf("Case %d: The total value of the hook is %d.
",cas,sum[1]);
53     }
54     return 0;
55 }
View Code
原文地址:https://www.cnblogs.com/-maybe/p/4361068.html