题目意思:就是说一个平面上有很多个矩形,求他们在平面上的覆盖面积
2 10 10 20 20 15 15 25 25.5 0
Test case #1 Total explored area: 180.00
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> using namespace std; #define maxn 1005 struct node { int L, R, cover; int Mid(){return (L+R)/2;} }; struct point { double x, y1, y2; bool IsLeft; }; bool cmp(point a, point b) { return a.x < b.x; } node a[maxn]; double Len, f[maxn]; void BuildTree(int r, int L, int R); void Insert(int r, int L, int R, bool IsLeft); void Query(int r); int main() { int N, ncase = 1; while(scanf("%d", &N), N) { int i, np=0, nf=0; double S = 0, x1, y1, x2, y2; point p[maxn]; for(i=0; i<N; i++) { cin >> x1 >> y1 >> x2 >> y2; p[np].x = x1, p[np].y1 = y1, p[np].y2 = y2, p[np++].IsLeft = true; p[np].x = x2, p[np].y1 = y1, p[np].y2 = y2, p[np++].IsLeft = false; f[nf++] = y1, f[nf++] = y2; } sort(f, f+nf); sort(p, p+np, cmp); nf = unique(f, f+nf) - f; BuildTree(1, 0, nf-1); for(i=0; i<np-1; i++) { int L = lower_bound(f, f+nf, p[i].y1) - f; int R = lower_bound(f, f+nf, p[i].y2) - f; Insert(1, L, R, p[i].IsLeft); Len = 0; Query(1); S += (p[i+1].x-p[i].x) * Len; } printf("Test case #%d\n", ncase++); printf("Total explored area: %.2f\n\n", S); } return 0; } void BuildTree(int r, int L, int R) { a[r].L = L, a[r].R = R, a[r].cover = false; if(L + 1 == R)return ; BuildTree(r*2, L, a[r].Mid()); BuildTree(r*2+1, a[r].Mid(), R); } void Insert(int r, int L, int R, bool IsLeft) { if(a[r].L == L && a[r].R == R) { if(IsLeft) a[r].cover++; else a[r].cover--; return ; } if(R <= a[r].Mid()) Insert(r*2, L, R, IsLeft); else if(L >= a[r].Mid()) Insert(r*2+1, L, R, IsLeft); else { Insert(r*2, L, a[r].Mid(), IsLeft); Insert(r*2+1, a[r].Mid(), R, IsLeft); } } void Query(int r) { if(a[r].cover) { Len += f[a[r].R] - f[a[r].L]; return ; } if(a[r].L+1 == a[r].R)return ; Query(r*2); Query(r*2+1); }