HDU 1698(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

属于区间染色与区间求和问题,用线段树解决~~~

代码如下:

 1 #include <stdio.h>

 2 #define N 300002

 3 #define LL(x) ((x)<<1)

 4 #define RR(x) ((x)<<1|1)

 5 

 6 typedef struct

 7 {

 8     int lson, rson;

 9     int val;

10 } seg_tree;

11 

12 seg_tree s[N];

13 

14 void build(int left, int right, int idx)

15 {

16     s[idx].lson = left;

17     s[idx].rson = right;

18     s[idx].val = 1;

19     if(left == right)

20     {

21         return;

22     }

23     int mid = (left + right) / 2;

24     build(left, mid, LL(idx));

25     build(mid + 1, right, RR(idx));

26 }

27 

28 void update(int left, int right, int idx, int val)

29 {

30     if(left <= s[idx].lson && s[idx].rson <= right)

31     {

32         s[idx].val = val;

33         return;

34     }

35     if(s[idx].val != -1)

36     {

37         s[LL(idx)].val = s[RR(idx)].val = s[idx].val;

38         s[idx].val = -1;

39     }

40     int mid = (s[idx].lson + s[idx].rson) / 2;

41     if(left <= mid)

42         update(left, right, LL(idx), val);

43     if(right > mid)

44         update(left, right, RR(idx), val);

45 }

46 

47 int query(int left, int right, int idx)

48 {

49     if(left == s[idx].lson && right == s[idx].rson)

50     {

51         if(s[idx].val != -1)

52         {

53             return (right - left + 1) * s[idx].val;

54         }

55         else

56         {

57             int mid = (s[idx].lson + s[idx].rson) / 2;

58             return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx));

59         }

60     }

61     int mid = (s[idx].lson + s[idx].rson) / 2;

62     if(right <= mid)

63     {

64         return query(left, right, LL(idx));

65     }

66     else if(left > mid)

67     {

68         return query(left, right, RR(idx));

69     }

70     else

71     {

72         return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx));

73     }

74 }

75 

76 int main()

77 {

78     int t;

79     int n;

80     int ncase;

81     int i, j;

82     int a, b, val;

83     scanf("%d", &t);

84     for(i = 1; i <= t; i++)

85     {

86         scanf("%d", &n);

87         scanf("%d", &ncase);

88         build(1, n, 1);

89         for(j = 0; j < ncase; j++)

90         {

91             scanf("%d%d%d", &a, &b, &val);

92             update(a, b, 1, val);

93         }

94         printf("Case %d: The total value of the hook is %d.\n", i, query(1, n, 1));

95     }

96     return 0;

97 }

第二种代码:

  1 #include <stdio.h>

  2 #define N 300000

  3 #define LL(x) ((x)<<1)

  4 #define RR(x) ((x)<<1|1)

  5 

  6 typedef struct

  7 {

  8     int lson, rson;

  9     int val;

 10 }  seg_tree;

 11 seg_tree s[N];

 12 

 13 int ans;

 14 

 15 void build(int left, int right, int idx)

 16 {

 17     s[idx].lson = left;

 18     s[idx].rson = right;

 19     s[idx].val = 1;

 20     if(left == right)

 21         return;

 22     else

 23     {

 24         int mid = (left + right) / 2;

 25         build(left, mid, LL(idx));

 26         build(mid + 1, right, RR(idx));

 27     }

 28 }

 29 

 30 void update(int left, int right, int idx, int val)

 31 {

 32     if(left == s[idx].lson && s[idx].rson == right)

 33     {

 34         s[idx].val = val;

 35         return;

 36     }

 37     if(s[idx].val == val)

 38         return;

 39     if(s[idx].val > 0)

 40     {

 41         s[LL(idx)].val = s[RR(idx)].val = s[idx].val;

 42         s[idx].val = 0;

 43     }

 44     int mid = (s[idx].lson + s[idx].rson) / 2;

 45     if(right <= mid)

 46     {

 47         update(left, right, LL(idx), val);

 48     }

 49     else if(left > mid)

 50     {

 51         update(left, right, RR(idx), val);

 52     }

 53     else

 54     {

 55         update(left, mid, LL(idx), val);

 56         update(mid + 1, right, RR(idx), val);

 57     }

 58 }

 59 

 60 int get_sum(int left, int right, int idx)

 61 {

 62     if(s[idx].val > 0)

 63     {

 64         return (s[idx].rson - s[idx].lson + 1) * s[idx].val;

 65     }

 66     else

 67     {

 68         int mid = (s[idx].lson + s[idx].rson) / 2;

 69         if(right <= mid)

 70         {

 71             return get_sum(left, right, LL(idx));

 72         }

 73         else if(left > mid)

 74         {

 75             return get_sum(left, right, RR(idx));

 76         }

 77         else

 78         {

 79             return get_sum(left, mid, LL(idx)) + get_sum(mid + 1, right, RR(idx));

 80         }

 81     }

 82 }

 83 

 84 int main()

 85 {

 86     int t;

 87     int n, ncase;

 88     int i, j;

 89     scanf("%d", &t);

 90     for(i = 1; i <= t; i++)

 91     {

 92         scanf("%d", &n);

 93         scanf("%d", &ncase);

 94         build(1, n, 1);

 95         int a, b, val;

 96         for(j = 0; j < ncase; j++)

 97         {

 98             scanf("%d%d%d", &a, &b, &val);

 99             update(a, b, 1, val);

100         }

101         printf("Case %d: The total value of the hook is %d.\n", i, get_sum(1, n, 1));

102     }

103     return 0;

104 }

刚开始时,用暴力解,但超时,也贴出代码:

 1 #include <stdio.h>

 2 #define N 100001

 3 

 4 int s[N];

 5 

 6 void solve(int a, int b, int c)

 7 {

 8     int i;

 9     for(i = a; i <= b; i++)

10     {

11         s[i] = c;

12     }

13 }

14 

15 int main()

16 {

17     int i, j;

18     int t;

19     int n;

20     int ncase;

21     int a, b, c, sum;

22     scanf("%d", &t);

23     for(i = 1; i <= t; i++)

24     {

25         sum = 0;

26         scanf("%d", &n);

27         for(j = 1; j <= n; j++)

28         {

29             s[j] = 1;

30         }

31         scanf("%d", &ncase);

32         for(j = 0; j < ncase; j++)

33         {

34             scanf("%d%d%d", &a, &b, &c);

35             solve(a, b, c);

36         }

37         for(j = 1; j <= n; j++)

38         {

39             sum += s[j];

40         }

41         printf("Case %d: The total value of the hook is %d.\n", i, sum);

42     }

43 }


你可能感兴趣的:(HDU)