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("\n"); 156 // for(i=1; i<=j; i++) 157 // { 158 // printf("%5d", hash[i]); 159 // } 160 // printf("\n"); 161 build(1, j-1, 1); 162 for(i=1; i<=n; i++) 163 { 164 // printf("update %lld %lld %lld\n", 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("\n"); 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("\n"); 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\n", i, temp, hash[i+1]-hash[i]); 185 } 186 printf("%lld\n", result); 187 return 0; 188 }