# Include <iostream> # include <cstdio> # include <algorithm> using namespace std; # define L (k) k <1 # define R (k) k <1 | 1 const int NO = 1005; struct X {int l, r; int s;} p [NO <2]; struct LINE {double l, r; double h; int s;} line [NO <1]; int n, m; double sum; double x [NO <1] = {-1 }; bool H (const LINE & a, const LINE & B) {return. h <B. h;} void creat (int k, int l, int r) {p [k]. l = l; p [k]. r = r; p [k]. s = 0; if (l = r) return; int mid = (l + r)> 1; creat (L (k), l, mid); creat (R (k), mid + 1, r) ;}int s; void update (int k, double l, double r) {if (p [k]. s! =-1 & x [p [k]. l] = l & x [p [k]. r + 1] = r) {if (p [k]. s = 2 & s =-1) sum-= x [p [k]. r + 1]-x [p [k]. l]; else if (p [k]. s = 1 & s = 1) sum + = x [p [k]. r + 1]-x [p [k]. l]; p [k]. s + = s; return;} if (p [k]. s! =-1) p [L (k)]. s = p [R (k)]. s = p [k]. s; int mid = (p [k]. l + p [k]. r)> 1; if (r <= x [mid + 1]) update (L (k), l, r ); else if (x [mid + 1] <= l) update (R (k), l, r); else {update (L (k), l, x [mid + 1]); update (R (k), x [mid + 1], r);} p [k]. s = p [L (k)]. s = p [R (k)]. s? P [L (k)]. s:-1;} int main () {freopen ("1.txt"," r ", stdin); int ttt; scanf (" % d ", & ttt ); while (ttt --) {scanf ("% d", & m); for (int I = 1; I <= m; I ++) {scanf ("% lf", & x [I], & line [I]. h, & x [m + I], & line [m + I]. h); line [I]. l = line [m + I]. l = x [I]; line [I]. r = line [m + I]. r = x [m + I]; line [I]. s = 1; line [m + I]. s =-1;} sort (x + 1, x + 2 * m + 1); sort (line + 1, line + 2 * m + 1, H ); n = 0; for (int I = 1; I <= 2 * m; I ++) if (x [I]! = X [i-1]) x [+ + n] = x [I]; creat (, n-1); double ans = sum = 0; line [0]. h = line [1]. h; for (int I = 1; I <= 2 * m; I ++) {ans + = (line [I]. h-line [i-1]. h) * sum; s = line [I]. s; update (1, line [I]. l, line [I]. r);} printf ("%. 2lf \ n ", ans);} return 0 ;}View Code
HDU1255 [line segment tree + scanning line]