天天看點

Color the ball HDU - 1556 (線段樹)

1 #include<iostream>
  2 #include<vector>
  3 #include<string>
  4 #include<cmath>
  5 #include<set>
  6 #include<algorithm>
  7 #include<cstdio>
  8 #include<map>
  9 #include<cstring>
 10 #include<list>
 11 
 12 #define MAXSIZE 100010
 13 
 14 using namespace std;
 15 
 16 int tree[MAXSIZE*4];
 17 int lz[MAXSIZE*4];
 18 int N;
 19 int cnt = 0;    // 控制輸出的列印格式 
 20 
 21 
 22 void init()
 23 {
 24     memset(tree, 0, sizeof(tree));
 25     memset(lz, 0, sizeof(lz));
 26 }
 27 
 28 
 29 void build(int node, int l, int r)
 30 {
 31     if(l == r)
 32     {
 33         tree[node] = 0;
 34         return;
 35     }
 36     int mid = (l+r)/2;
 37     build(node*2, l, mid);
 38     build(node*2+1, mid+1, r);
 39     
 40     tree[node] = tree[node*2] + tree[node*2+1];
 41 }
 42 
 43 
 44 void push_down(int node, int l, int r)
 45 {
 46     if(lz[node])
 47     {
 48         int mid = (l+r)/2;
 49         lz[node*2] += lz[node];
 50         lz[node*2+1] += lz[node];
 51         tree[node*2] += (mid-l+1)*lz[node];
 52         tree[node*2+1] += (r-mid)*lz[node];
 53         lz[node] = 0;
 54     }
 55 }
 56 
 57 
 58 void update_range(int node, int l, int r, int L, int R, int add)
 59 {
 60     if(l <= L && r >= R)
 61     {
 62         lz[node] += add;
 63         tree[node] += (R-L+1)*add;
 64         return;
 65     }
 66     
 67     push_down(node, L, R);
 68     int mid = (L+R)/2;
 69     if(mid >= l)
 70         update_range(node*2, l, r, L, mid, add);
 71     if(mid < r)
 72         update_range(node*2+1, l, r, mid+1, R, add);
 73     
 74     tree[node] = tree[node*2] + tree[node*2+1];  
 75 }
 76 
 77 
 78 void print(int node, int l, int r)
 79 {
 80     if(l == r)
 81     {
 82         cnt++;
 83         printf("%d", tree[node]);
 84         if(cnt != N)
 85             printf(" ");
 86         else
 87             printf("\n");
 88         return;
 89     }
 90     push_down(node, l, r);    // 此處一定要記得push_down ! 
 91     int mid = (l+r)/2;
 92     print(node*2, l, mid);
 93     print(node*2+1, mid+1, r);
 94     
 95 }
 96 
 97 int main()
 98 {    
 99     
100     while(scanf("%d", &N) != EOF)
101     {
102         if(N == 0)
103             break;
104         init();
105         build(1, 1, N);
106         for(int i = 0; i < N; ++i)
107         {
108             int a, b;
109             scanf("%d%d", &a, &b);
110             update_range(1, a, b, 1, N, 1);
111         }
112         cnt = 0;
113         print(1, 1, N);
114     }
115 
116     return 0;
117 }