求矩形面积并
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std ;
const double eps = 1e-6 ;
const int N = 10000 ;
double ans, sum[N*4 ];
double X[N], x1[N], x2[N], yyy1[N], y2[N];
int flag[N], ti;
struct TR {
double x1, x2, y;
int opt;
TR ( ) { }
TR ( double x11, double x21, double yyy1, int opt1 )
{ x1 = x11, x2 = x21, y = yyy1, opt = opt1; }
} line[N*4 ];
bool cmp ( TR a, TR b ) { return a.y < b.y; }
int find ( double x, int n ) {
int l = 1 , r = n, mid;
while ( l <= r ) {
mid = (l+r) >> 1 ;
if ( X[mid] == x ) return mid;
else if ( X[mid] < x ) l = mid + 1 ;
else r = mid - 1 ;
}
}
void push_down ( int nd, int l, int r ) {
if ( flag[nd] ) sum[nd] = X[r+1 ]-X[l];
else if ( l == r ) sum[nd] = 0 ;
else sum[nd] = sum[2 *nd]+sum[2 *nd+1 ];
}
void update ( int nd, int l, int r, int L, int R, int opt ) {
if ( l >= L && r <= R ) {
flag[nd] += opt;
push_down ( nd, l, r );
return ;
}
int mid = (l+r) >> 1 ;
if ( L <= mid ) update ( nd*2 , l, mid, L, R, opt );
if ( R > mid ) update ( nd*2 +1 , mid+1 , r, L, R, opt );
push_down ( nd, l, r );
}
int main ( ) {
int n;
while ( scanf ( "%d" , &n ) == 1 ) {
int num = 0 ;
if ( n == 0 ) break ;
memset ( flag, 0 , sizeof ( flag ) );
memset ( sum, 0 , sizeof ( sum ) );
for ( int i = 1 ; i <= n; i ++ ) {
scanf ( "%lf%lf%lf%lf" , &x1[i], &yyy1[i], &x2[i], &y2[i] );
line[++num] = TR ( x1[i], x2[i], yyy1[i], 1 );
X[num] = x1[i];
line[++num] = TR ( x1[i], x2[i], y2[i], -1 );
X[num] = x2[i];
}
sort ( X+1 , X+1 +num );
sort ( line+1 , line+1 +num, cmp );
int k = 1 ;
for ( int i = 2 ; i <= num; i ++ )
if ( X[i] != X[i+1 ] ) X[++k] = X[i];
double ans = 0 ;
for ( int i = 1 ; i < num; i ++ ) {
int L = find ( line[i].x1, k );
int R = find ( line[i].x2, k ) - 1 ;
update ( 1 , 1 , k, L, R, line[i].opt );
ans += sum[1 ] * (line[i+1 ].y-line[i].y);
}
printf ( "Test case #%d\nTotal explored area: %.2lf\n\n" , ++ti, ans );
}
return 0 ;
}