#include <iostream> #include <cstdio> #include <algorithm> #define LL(x) ((x) << 1) #define RR(x) ((x) << 1 | 1) using namespace std; const int N = 100005; struct Seg_tree{ int l, r; int st; double sum; int mid(){ return (l + r) >> 1; } }tree[4 * N]; struct Line{ double high; double l, r; int st; }line[N]; double pos[N]; int len; inline bool cmp(const Line &a, const Line &b){ return a.high < b.high; } inline void Build(int l, int r, int node){ tree[node].l = l; tree[node].r = r; tree[node].st = 0; tree[node].sum = 0; if(l == r) return; int mid= (l + r) >> 1; Build(l, mid, LL(node)); Build(mid + 1, r, RR(node)); } inline void Update(int l, int r, int node, int st){ if(l <= tree[node].l && tree[node].r <= r){ tree[node].st += st; if(tree[node].st){ tree[node].sum = pos[tree[node].r + 1] - pos[tree[node].l]; } else if(tree[node].l == tree[node].r){ tree[node].sum = 0; } else { tree[node].sum = tree[LL(node)].sum + tree[RR(node)].sum; } return ; } int mid = tree[node].mid(); if(r <= mid){ Update(l, r, LL(node), st); } else if(l > mid){ Update(l, r, RR(node), st); } else{ Update(l, mid, LL(node), st); Update(mid + 1, r, RR(node), st); } if(tree[node].st){ tree[node].sum = pos[tree[node].r + 1] - pos[tree[node].l]; } else if(tree[node].l == tree[node].r){ tree[node].sum = 0; } else { tree[node].sum = tree[LL(node)].sum + tree[RR(node)].sum; } } inline int Bin(double x){ int low = 1; int high = len - 1; while (low <= high){ int mid = (low + high) >> 1; //printf("mid :: %d/n", mid); if(pos[mid] == x) { return mid; } else if (pos[mid] < x){ low = mid + 1; } else{ high = mid - 1; } } return -1; } int main(){ int n; int Case = 1; while(scanf("%d", &n) != EOF && n){ double x1, y1, x2, y2; int tt = 1; for(int i = 1; i <= n; i++){ scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2); //int ll = LL(i); //int rr = RR(i); int ll = tt; int rr = tt + 1; line[ll].high = y1; line[rr].high = y2; line[ll].st = 1; line[rr].st = -1; pos[ll] = line[ll].l = line[rr].l = x1; pos[rr] = line[rr].r = line[ll].r = x2; tt += 2; } //int tt = RR(n); //printf("tt :: %d/n", tt); sort(&pos[1], &pos[1] + tt - 1); sort(&line[1], &line[1] + tt - 1, cmp); len = 1; for(int i = 1; i < tt; i++){ //if(pos[i] != pos[i + 1]) if(i == 1 || pos[i] != pos[i - 1]) pos[len++] = pos[i]; } //for(int i = 1; i < tt; i++){ //printf("line :: %0.2lf %0.2lf/n", line[i].l, line[i].r); //} //printf("len :: %d/n", len); Build(1 , len, 1); double ans = 0; for(int i = 1; i < tt ; i++){ int l = Bin(line[i].l); int r = Bin(line[i].r) - 1; //printf("line :: %0.2lf %0.2lf/n", line[i].l, line[i].r); //printf("i :: %d L :: %d R :: %d/n", i, l, r); //puts("=="); Update(l, r, 1, line[i].st); ans += tree[1].sum * (line[i +1].high - line[i].high); //printf("ans :: %0.2lf/n", ans); } printf("Test case #%d/n", Case++); printf("Total explored area: %0.2lf/n/n", ans); } } /* * 线段树就矩形面积的并 * 线段树 + 扫描线 + 离散化 * http://acm.pku.edu.cn/JudgeOnline/problem?id=1151 * */ #include <iostream> #include <cstdio> #include <algorithm> #define LL(x) ((x) << 1) #define RR(x) ((x) << 1 | 1) using namespace std; const int N = 100005; struct Seg_tree { int l, r; int st; //表示区间背覆盖的层数 double sum; int mid() { return (l + r) >> 1; } } tree[4 * N]; struct Line { double high; double l, r; int st;// st = 1 表示下边 st = -1 表示上边 } line[N]; double pos[N]; int len; inline bool cmp(const Line &a, const Line &b) { return a.high < b.high; } inline void Build(int l, int r, int node) { tree[node].l = l; tree[node].r = r; tree[node].st = 0; tree[node].sum = 0; if (l == r) return; int mid = (l + r) >> 1; Build(l, mid, LL(node)); Build(mid + 1, r, RR(node)); } inline void Update(int l, int r, int node, int st) { if (l <= tree[node].l && tree[node].r <= r) { tree[node].st += st; /* printf( "node :: %d l :: %d tree[node].l ::%d tree[noode].r :: %d r :: %d /n", node, l, tree[node].l, tree[node].r, r); printf("tree[node].st :: %d/n", tree[node].st); */ if (tree[node].st) {// 为何要 +1?? tree[node].sum = pos[tree[node].r + 1] - pos[tree[node].l]; //puts("1"); } else if (tree[node].l == tree[node].r) { tree[node].sum = 0; //puts("2"); } else { //printf("tree[node].sum :: %0.2lf/n", tree[node].sum); //printf("tree[LL(node)].sum :: %0.2lf tree[RR(node)].sum :: %0.2lf/n", // tree[LL(node)].sum ,tree[RR(node)].sum); tree[node].sum = tree[LL(node)].sum + tree[RR(node)].sum; //puts("3"); } return; } int mid = tree[node].mid(); /* if(r <= mid){ Update(l, r, LL(node), st); } else if(l > mid){ Update(l, r, RR(node), st); } else{ Update(l, mid, LL(node), st); Update(mid + 1, r, RR(node), st); } */ if (l <= mid) Update(l, r, LL(node), st); if (mid < r) Update(l, r, RR(node), st); if (tree[node].st) { // 为何要 +1?? tree[node].sum = pos[tree[node].r + 1] - pos[tree[node].l]; } else if (tree[node].l == tree[node].r) { tree[node].sum = 0; } else { tree[node].sum = tree[LL(node)].sum + tree[RR(node)].sum; } } inline int Bin(double x) { int low = 0; int high = len - 1; while (low <= high) { int mid = (low + high) >> 1; //printf("mid :: %d/n", mid); if (pos[mid] == x) { return mid; } if (pos[mid] < x) { low = mid + 1; } else { high = mid - 1; } } return -1; } int main() { int n; int Case = 1; while (scanf("%d", &n) != EOF && n) { double x1, y1, x2, y2; int tt = 0; for (int i = 0; i < n; i++) { scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2); //int ll = LL(i); //int rr = RR(i); line[tt].high = y1; line[tt + 1].high = y2; line[tt].st = 1; line[tt + 1].st = -1; pos[tt] = line[tt].l = line[tt + 1].l = x1; pos[tt + 1] = line[tt].r = line[tt + 1].r = x2; tt += 2; } //int tt = RR(n - 1); sort(pos, pos + tt); sort(line, line + tt, cmp); len = 0; for (int i = 0; i < tt; i++) { //if(pos[i] != pos[i + 1]) if (i == 0 || pos[i] != pos[i - 1]) pos[len++] = pos[i]; } Build(0, len - 1, 1); /* for (int i = 0; i < tt; i++) { printf("line :: %0.2lf %0.2lf/n", line[i].l, line[i].r); } for (int i = 0; i < len; i++) { printf("pos :: %0.2lf/n", pos[i]); } */ double ans = 0; for (int i = 0; i < tt - 1; i++) { int l = Bin(line[i].l); int r = Bin(line[i].r) - 1; // 这里为何要-1?? //printf("line :: %0.2lf %0.2lf/n", line[i].l, line[i].r); //printf("i :: %d L :: %d R :: %d/n", i, l, r); //puts("=="); if (l > r) { // 可以不加的 ans += tree[1].sum * (line[i + 1].high - line[i].high); continue; } Update(l, r, 1, line[i].st); ans += tree[1].sum * (line[i + 1].high - line[i].high); //printf("tree[1].sum :: %0.2lf/n", tree[1].sum); //printf("ans :: %0.2lf/n", ans); } printf("Test case #%d/n", Case++); printf("Total explored area: %0.2lf/n/n", ans); } }