【HDOJ】1556 Color the ball

解法一:线段树, 延迟更新.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 using namespace std;
 6 
 7 #define MAXN 100001
 8 #define lson l, mid, rt<<1
 9 #define rson mid+1, r, rt<<1|1
10 
11 int sum[MAXN<<2];
12 int delta[MAXN<<2];
13 
14 void PushUp(int rt) {
15     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
16 }
17 
18 void PushDown(int rt, int n) {
19     if (delta[rt]) {
20         delta[rt<<1] += delta[rt];
21         delta[rt<<1|1] += delta[rt];
22         sum[rt<<1] += delta[rt] * (n - (n>>1));
23         sum[rt<<1|1] += delta[rt] * (n>>1);
24         delta[rt] = 0;
25     }
26 }
27 
28 void build() {
29     memset(sum, 0, sizeof(sum));
30     memset(delta, 0, sizeof(delta));
31 }
32 
33 void update(int ll, int rr, int l, int r, int rt) {
34     if (ll<=l && rr>=r) {
35         delta[rt]++;
36         sum[rt] += r-l+1;
37         return ;
38     }
39     PushDown(rt, r-l+1);
40     int mid = (l+r)>>1;
41     if (ll <= mid)
42         update(ll, rr, lson);
43     if (mid < rr)
44         update(ll, rr, rson);
45     PushUp(rt);
46 }
47 
48 int query(int ll, int rr, int l, int r, int rt) {
49     if (ll<=l && rr>=r) {
50         return sum[rt];
51     }
52     PushDown(rt, r-l+1);
53     int mid = (l+r)>>1, ret = 0;
54     if (ll <= mid)
55         ret += query(ll, rr, lson);
56     if (mid < rr)
57         ret += query(ll, rr, rson);
58     return ret;
59 }
60 
61 int main() {
62     int n, a, b;
63     int i, tmp;
64 
65     while (scanf("%d", &n)!=EOF && n) {
66         build();
67         for (i=0; i<n; ++i) {
68             scanf("%d %d", &a, &b);
69             update(a, b, 1, n, 1);
70         }
71         for (i=1; i<=n; ++i) {
72             tmp = query(i, i, 1, n, 1);
73             if (i != n)
74                 printf("%d ", tmp);
75             else
76                 printf("%d\n", tmp);
77         }
78     }
79 
80     return 0;
81 }

解法二:树状数组

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 #define MAXN 100001
 5 
 6 int sum[MAXN];
 7 int n;
 8 
 9 int lowbit(int x) {
10     return x&(-x);
11 }
12 
13 void update(int x, int delta) {
14     while (x <= n) {
15         sum[x] += delta;
16         x += lowbit(x);
17     }
18 }
19 
20 int getSum(int x) {
21     int ret = 0;
22     while (x > 0) {
23         ret += sum[x];
24         x -= lowbit(x);
25     }
26     return ret;
27 }
28 
29 int main() {
30     int i, a, b;
31 
32     while (scanf("%d", &n)!=EOF && n) {
33         memset(sum, 0, sizeof(sum));
34         for (i=1; i<=n; ++i) {
35             scanf("%d %d", &a, &b);
36             update(a, 1);
37             update(b+1, -1);
38         }
39         for (i=1; i<=n; ++i) {
40             int tmp = getSum(i);
41             if (i != n)
42                 printf("%d ", tmp);
43             else
44                 printf("%d\n", tmp);
45         }
46     }
47     return 0;
48 }

 

posted on 2014-10-09 23:12  Bombe  阅读(136)  评论(0编辑  收藏  举报

导航