pku3277 City Horizon

http://poj.org/problem?id=3277

线段树,离散化,成段更新

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define lson l, m, root<<1
  5 #define rson m+1, r, root<<1|1
  6 
  7 const long long N = 80080;
  8 const long long inf = (1<<31)-1;
  9 
 10 long long max1[N<<2], color[N<<2];
 11 
 12 long long max(long long x, long long y)
 13 {
 14     return x>y? x: y;
 15 }
 16 
 17 void push_up(long long root)
 18 {
 19     max1[root] = max(max1[root<<1], max1[root<<1|1]);
 20 }
 21 
 22 void push_down(long long l, long long r, long long root)
 23 {
 24     color[root<<1] = max(color[root<<1], color[root]);
 25     color[root<<1|1] = max(color[root<<1|1], color[root]);
 26     color[root] = -1;
 27     max1[root<<1] = max(max1[root<<1], color[root<<1]);
 28     max1[root<<1|1] = max(max1[root<<1|1], color[root<<1|1]);
 29 }
 30 
 31 void build(long long l, long long r, long long root)
 32 {
 33     long long m;
 34     color[root] = -1;
 35     if(l == r)
 36     {
 37         max1[root] = 0;
 38         return;
 39     }
 40     m = (l + r) >> 1;
 41     build(lson);
 42     build(rson);
 43     push_up(root);
 44 }
 45 
 46 void update(long long L, long long R, long long x, long long l, long long r, long long root)
 47 {
 48     long long m;
 49     if(L <= l && r <= R)
 50     {
 51         color[root] = max(color[root], x);
 52         max1[root] = max(max1[root], color[root]);
 53         return;
 54     }
 55     m = (l + r) >> 1;
 56     if(color[root] != -1)
 57     {
 58         push_down(l, r, root);
 59     }
 60     if(L <= m)
 61     {
 62         update(L, R, x, lson);
 63     }
 64     if(m+1 <= R)
 65     {
 66         update(L, R, x, rson);
 67     }
 68     push_up(root);
 69 }
 70 
 71 long long query(long long L, long long R, long long l, long long r, long long root)
 72 {
 73     long long m, result = 0;
 74     if(L <= l && r <= R)
 75     {
 76         return max1[root];
 77     }
 78     m = (l + r) >> 1;
 79     if(color[root] != -1)
 80     {
 81         push_down(l, r, root);
 82     }
 83     if(L <= m)
 84     {
 85         result = max(result, query(L, R, lson));
 86     }
 87     if(m+1 <= R)
 88     {
 89         result = max(result, query(L, R, rson));
 90     }
 91     push_up(root);
 92     return result;
 93 }
 94 
 95 struct B
 96 {
 97     long long x, y;
 98     long long h;
 99 }b[N>>1];
100 
101 long long a[N], hash[N];
102 
103 long long bs(long long l, long long r, long long x)
104 {
105     long long m;
106     while(l < r)
107     {
108         m = (l + r) >> 1;
109         if(hash[m] == x)
110         {
111             return m;
112         }
113         if(hash[m] < x)
114         {
115             l = m + 1;
116         }
117         else
118         {
119             r = m;
120         }
121     }
122 }
123 
124 int cmp0(const void *a, const void *b)
125 {
126     return *(long long *)a - *(long long *)b;
127 }
128 
129 int main()
130 {
131     long long n, i, j, temp, result = 0;
132     long long k;
133     scanf("%lld", &n);
134     for(i=1; i<=n; i++)
135     {
136         scanf("%lld%lld%lld", &b[i].x, &b[i].y, &b[i].h);
137         a[(i-1)*2+1] = b[i].x;
138         a[(i-1)*2+2] = b[i].y;
139     }
140     qsort(a+1, 2*n, sizeof(a[0]), cmp0);
141     j = 1;
142     hash[j] = a[1];
143     for(i=2; i<=2*n; i++)
144     {
145         if(a[i] != a[i-1])
146         {
147             j = j + 1;
148             hash[j] = a[i];
149         }
150     }
151 //    for(i=1; i<=j; i++)
152 //    {
153 //        printf("%5d", i);
154 //    }
155 //    printf("
");
156 //    for(i=1; i<=j; i++)
157 //    {
158 //        printf("%5d", hash[i]);
159 //    }
160 //    printf("
");
161     build(1, j-1, 1);
162     for(i=1; i<=n; i++)
163     {
164 //        printf("update %lld %lld %lld
", bs(1, j+1, b[i].x), bs(1, j+1, b[i].y)-1, b[i].h);
165         update(bs(1, j+1, b[i].x), bs(1, j+1, b[i].y)-1, b[i].h, 1, j, 1);
166 //        for(k=1; k<=j-1; k++)
167 //        {
168 //            printf("%4d", k);
169 //        }
170 //        printf("
");
171 //        for(k=1; k<=j-1; k++)
172 //        {
173 //            temp = query(k, k, 1, j, 1);
174 //            result += (temp * (hash[k+1]-hash[k]));
175 //            printf("%4d", temp);
176 //        }
177 //        printf("
");
178     }
179     result = 0;
180     for(i=1; i<=j-1; i++)
181     {
182         temp = query(i, i, 1, j, 1);
183         result += (temp * (hash[i+1]-hash[i]));
184 //        printf("%lld %lld %lld
", i, temp, hash[i+1]-hash[i]);
185     }
186     printf("%lld
", result);
187     return 0;
188 }
原文地址:https://www.cnblogs.com/yuan1991/p/pku3277.html