标签:hdu 1542 atlantis 矩形面积并 线段树
2 10 10 20 20 15 15 25 25.5 0
Test case #1 Total explored area: 180.00
题意:给你n个矩形,求面积的并。
http://www.cnblogs.com/scau20110726/archive/2013/03/21/2972808.html
这里有句话对扫描线的理解很有帮助:就好比一个畸形的容器,往里面倒水,从最下面往上面涨,被水淹过的部分其实就是我们要求的面积。
其实就是线段树不断更新X轴被覆盖的情况,然后倒水,水深增加为a[i+1].y-a[i].y,这样面积就是所有x轴覆盖的长度*a[i+1].y-a[i].y。
#include<cstring> #include<cstdio> #include<algorithm> #include<iostream> #define lc idx<<1 #define rc idx<<1|1 #define lson l,mid,lc #define rson mid,r,rc #define N 222 using namespace std; int n,m; double X[N]; struct Jidong { double lx,rx,y; int flag; } a[N]; struct _Jidong { double len; int cnt; } tree[N<<2]; bool cmp(Jidong a,Jidong b) { if(a.y==b.y)return a.flag>b.flag; return a.y<b.y; } void push_up(int l,int r,int idx) { if(tree[idx].cnt) tree[idx].len=X[r]-X[l]; else if(l+1==r)tree[idx].len=0; else tree[idx].len=tree[lc].len+tree[rc].len; } void build(int l,int r,int idx) { tree[idx].len=tree[idx].cnt=0; if(l+1==r)return; int mid=(l+r)>>1; build(l,mid,lc); build(mid,r,rc);///这里必须注意 } void update(int l,int r,int idx,int x,int y,int flag) { if(x<=l&&r<=y) { tree[idx].cnt+=flag; push_up(l,r,idx); return; } int mid=(r+l)>>1; if(x<mid)update(lson,x,y,flag); if(y>mid)update(rson,x,y,flag); push_up(l,r,idx); } int main() { //freopen("test.in","r",stdin); int ca=1; while(cin>>n) { if(!n)break; double x,y,_x,_y; m=1; for(int i=0; i<n; i++) { scanf("%lf%lf%lf%lf",&x,&y,&_x,&_y); X[m]=x; a[m].lx=x,a[m].rx=_x; a[m].y=y,a[m++].flag=1; X[m]=_x; a[m].lx=x,a[m].rx=_x; a[m].y=_y,a[m++].flag=-1; } sort(X+1,X+m);//离散x,排序 sort(a+1,a+m,cmp);///y从小到大排序 int mm=1; X[mm++]=X[1]; for(int i=2; i<m; i++) {///去重 if(X[i]!=X[i-1])X[mm++]=X[i]; } build(1,mm-1,1); double ans=0; for(int i=1; i<m-1; i++) { int l=lower_bound(X+1,X+mm,a[i].lx)-X;///找对应下标 int r=lower_bound(X+1,X+mm,a[i].rx)-X; update(1,mm-1,1,l,r,a[i].flag); ans+=tree[1].len*(a[i+1].y-a[i].y);///ans+=X的覆盖长度*y增加高度 } printf("Test case #%d\n",ca++); printf("Total explored area: %.2f\n\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hdu 1542 atlantis 矩形面积并 线段树
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/47308005