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 }

你可能感兴趣的:(HDU)