hdu 1255
来源:互联网 发布:nginx书籍 编辑:程序博客网 时间:2024/06/10 17:45
面积并:#include <iostream>#include <string.h>using namespace std;struct node{ int l; int r; int cover; double once; double len;};node tree[7000];struct Line{ double x; double y_down; double y_up; int cover;};Line line[7000];double yy[7000];bool cmp(Line a,Line b){ if( a.x == b.x ) return a.cover > b.cover; else return a.x < b.x;}void Build(int i,int l,int r){ tree[i].l = l; tree[i].r = r; tree[i].cover = 0; tree[i].once = 0.0; if(tree[i].l == tree[i].r - 1 ) return ; int mid =(l+r)/2; Build(i*2,l,mid); Build(i*2+1,mid,r);}void fun(int i){ if( tree[i].cover >= 2 ) { tree[i].once = 0; tree[i].len = yy[tree[i].r] - yy[tree[i].l]; return ; } if( tree[i].cover == 1 ) { if( tree[i].l == tree[i].r - 1 ) tree[i].len = 0; else tree[i].len = tree[2*i+1].len + tree[2*i].len + tree[2*i+1].once + tree[2*i].once; tree[i].once = yy[tree[i].r] - yy[tree[i].l] - tree[i].len; return ; } if( tree[i].cover == 0 ) { if( tree[i].l == tree[i].r - 1 ) tree[i].len =tree[i].once = 0; else { tree[i].len = tree[2*i+1].len + tree[2*i].len; tree[i].once =tree[2*i+1].once+tree[2*i].once; } return ; }}void Updata(int i, Line p){ if( yy[tree[i].l] >= p.y_down && yy[tree[i].r] <= p.y_up ) { tree[i].cover += p.cover; fun(i); return ; } if( tree[i].l == tree[i].r - 1 ) return ; int mid = (tree[i].l+tree[i].r)/2; if( p.y_down <= yy[mid] ) Updata(2*i,p); if( p.y_up > yy[mid] ) Updata(2*i+1,p); fun(i);}int main(){ int t,n; double x1,x2,y1,y2; scanf("%d",&t); while( t-- ) { scanf("%d",&n); int m = 0; for(int i=0; i<n; i++) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); line[m].x = x1; line[m].y_down = y1; line[m].y_up = y2; line[m].cover = 1; yy[m++] = y1; line[m].x = x2; line[m].y_down = y1; line[m].y_up = y2; line[m].cover = -1; yy[m++] = y2; } sort(yy,yy+m); sort(line,line+m,cmp); int i = unique(yy,yy+m) - yy; Build(1,0,i-1); double ans = 0; Updata(1,line[0]); for(int i=1; i<m; i++) { ans += tree[1].len*(line[i].x - line[i-1].x); Updata(1,line[i]); } printf("%.2lf\n",ans); }return 0;}