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 }


posted @ 2012-09-03 19:09  山路水桥  阅读(188)  评论(0编辑  收藏  举报