[题解]hdu1542 Atlantis

来源:互联网 发布:tensorflow wordvec 编辑:程序博客网 时间:2024/05/29 16:07

Description

There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend Bill has to know the total area for which maps exist. You (unwisely) volunteered to write a program that calculates this quantity.

Input

The input file consists of several test cases. Each test case starts with a line containing a single integer n (1<=n<=100) of available maps. The n following lines describe one map each. Each of these lines contains four numbers x1;y1;x2;y2 (0<=x1

Output

For each test case, your program should output one section. The first line of each section must be “Test case #k”, where k is the number of the test case (starting with 1). The second one must be “Total explored area: a”, where a is the total explored area (i.e. the area of the union of all rectangles in this test case), printed exact to two digits to the right of the decimal point.
Output a blank line after each test case.

Sample Input

210 10 20 2015 15 25 25.50

Sample Output

Test case #1Total explored area: 180.00 

Solution

矩形面积并,扫描线+线段树或者扫描线+直接暴力即可。就是记录下当前扫描线上被覆盖的宽度,每上移一格就更新答案。

代码:(扫描线+直接暴力)

#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;template<typename T>inline void read(T &x){    T f=1;char ch=getchar();    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;    for(x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';    x*=f;}const int maxn=310;const double eps=1e-10;struct Seg{    double l,r,y,len;    int f;    bool operator<(Seg b)const{        if(fabs(y-b.y)<=eps)return f<b.f;        return y<b.y;    }}q[maxn];int n,cnt,T,tot,tot2,mp[maxn];double ans,a[maxn],b[maxn];int lower_bound(double *p,int l,int r,double val){    int pos=r+1,mid;    while(l<=r){        mid=(l+r)>>1;        if(val-p[mid]>eps)l=mid+1;        else r=mid-1,pos=mid;    }    return pos;}int main(){    while(read(n),n){        ans=0;cnt=tot=tot2=0;        memset(mp,0,sizeof mp);        for(int i=1;i<=n;i++){            double x1,y1,x2,y2;            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);            a[++tot]=x1;a[++tot]=x2;            q[++cnt].l=x1;q[cnt].r=x2;            q[cnt].y=y1;q[cnt].f=0;q[cnt].len=x2-x1;            q[++cnt].l=x1;q[cnt].r=x2;            q[cnt].y=y2;q[cnt].f=1;q[cnt].len=x2-x1;        }        sort(a+1,a+tot+1);        sort(q+1,q+cnt+1);        for(int i=1,j;i<=tot;i=j){            b[++tot2]=a[i];j=i;            while(fabs(a[j]-a[i])<=eps&&j<=tot)j++;        }        for(int i=1;i<=cnt;i++){            q[i].l=lower_bound(b,1,tot2,q[i].l);            q[i].r=lower_bound(b,1,tot2,q[i].r);        }        double lasty=0;        for(int i=1;i<=cnt;i++){            double l=0;            for(int j=1;j<tot2;j++)if(mp[j])l+=(b[j+1]-b[j]);            ans+=(q[i].y-lasty)*l;lasty=q[i].y;            if(!q[i].f)for(int j=q[i].l;j<q[i].r;j++)mp[j]++;            else for(int j=q[i].l;j<q[i].r;j++)mp[j]--;        }        printf("Test case #%d\nTotal explored area: %.2lf\n\n",++T,ans);    }    return 0;}
原创粉丝点击