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.\n",cas,sum[1]);

53     }

54     return 0;

55 }
View Code

 

你可能感兴趣的:(HDU)