您的位置:首页 > 其它

HDU 1556 Color the ball 线段树

2016-01-06 15:38 309 查看
HDU 1556 Color the ball
线段树模版题,存个模板

 

1 #include <iostream>
2 #include <cstdio>
3 #define LL long long
4 #define eps 1e-8
5 #define INF 0x3f3f3f3f
6 #define MAXN 100005
7 using namespace std;
8 int sum[MAXN * 3], add[MAXN * 3];
9
10 void pushup(int t){
11     sum[t] = sum[t << 1] + sum[t << 1 | 1];
12 }
13 void pushdown(int t, int x){
14     if (add[t]){
15         add[t << 1] += add[t];
16         add[t << 1 | 1] += add[t];
17         sum[t << 1] += ((x + 1) >> 1)* add[t];
18         sum[t << 1 | 1] += (x >> 1) * add[t];
19         add[t] = 0;
20     }
21 }
22 void update(int L, int R, int t, int p, int q, int x){
23     if (p <= L && q >= R){
24         sum[t] += (R - L + 1) * x;
25         add[t] += x;
26         return;
27     }
28
29     pushdown(t, R - L + 1);
30     int mid = (L + R) >> 1;
31     if (p <= mid){
32         update(L, mid, t << 1, p, q, x);
33     }
34     if (q > mid){
35         update(mid + 1, R, t << 1 | 1, p, q, x);
36     }
37     pushup(t);
38 }
39 int query(int L, int R, int t, int p, int q){
40     if (p <= L && q >= R){
41         return sum[t];
42     }
43     pushdown(t, R - L + 1);
44     int mid = (L + R) >> 1;
45     int res = 0;
46     if (p <= mid){
47         res += query(L, mid, t << 1, p, q);
48     }
49     if (q > mid){
50         res += query(mid + 1, R, t << 1 | 1, p, q);
51     }
52     return  res;
53 }
54 int main()
55 {
56     int n;
57     while (~scanf("%d", &n) && n){
58         memset(sum, 0, sizeof(sum));
59         memset(add, 0, sizeof(add));
60         int x, y;
61         for (int i = 1; i <= n; i++){
62             scanf("%d%d", &x, &y);
63             update(1, n, 1, x, y, 1);
64         }
65         for (int i = 1; i < n; i++){
66             printf("%d ", query(1, n, 1, i, i));
67         }
68         printf("%d\n", query(1, n, 1, n, n));
69     }
70 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: