POJ 1151 Atlantis (离散化求矩形面积并)

题意:在二维平面上给出n个矩形的顶点坐标(浮点数),每个矩形的边都平行坐标轴,求矩形覆盖的面积。

数据范围:n<=100,  0=<x,y<=100000

分析:由于n比较小,所以用离散化就能过(离散化的具体分析见上一篇)。

View Code
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define N 110

int n;

double xl[N],yl[N];

double xr[N],yu[N];

double x[2*N],y[2*N];

int xcnt,ycnt;

bool flag[2*N][2*N];



int cmp(const void *a,const void *b)

{

    return *(double*)a>*(double*)b?1:-1;

}

void init()

{

    xcnt=ycnt=0;

    memset(flag,0,sizeof(flag));

}

void read()

{

    double a,b,c,d;

    for(int i=0;i<n;i++)

    {

        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);

        xl[i]=a;    yl[i]=b;

        xr[i]=c;    yu[i]=d;



        x[xcnt++]=a;    x[xcnt++]=c;

        y[ycnt++]=b;    y[ycnt++]=d;

    }

}

int bsx(double k)

{

    int min=0,max=xcnt,mid;

    while(min+1!=max)

    {

        mid=min+max>>1;

        if(x[mid]>k)    max=mid;

        else    min=mid;

    }

    return min;

}

int bsy(double k)

{

    int min=0,max=ycnt,mid;

    while(min+1!=max)

    {

        mid=min+max>>1;

        if(y[mid]>k)    max=mid;

        else    min=mid;

    }

    return min;

}

void solve()

{

    int i,j,k;

    qsort(x,xcnt,sizeof(x[0]),cmp);

    qsort(y,ycnt,sizeof(y[0]),cmp);



    k=xcnt;

    xcnt=0;

    x[xcnt++]=x[0];

    for(i=1;i<k;i++)    if(x[xcnt-1]!=x[i])  x[xcnt++]=x[i];





    k=ycnt;

    ycnt=0;

    y[ycnt++]=y[0];

    for(i=1;i<k;i++)    if(y[ycnt-1]!=y[i])  y[ycnt++]=y[i];



    int a,b,c,d;

    for(k=0;k<n;k++)

    {

        a=bsx(xl[k]);    b=bsy(yl[k]);

        c=bsx(xr[k]);    d=bsy(yu[k]);

        for(i=a;i<c;i++)

        {

            for(j=b;j<d;j++)    flag[i][j]=true;

        }

    }

    double ans=0;

    for(i=0;i<xcnt-1;i++)

    {

        for(j=0;j<ycnt-1;j++)   if(flag[i][j])  ans+=(x[i+1]-x[i])*(y[j+1]-y[j]);

    }

    printf("Total explored area: %.2lf\n\n",ans);

}

int main()

{

    int kase=0;

    while(scanf("%d",&n),n)

    {

        init();

        read();

        printf("Test case #%d\n",++kase);

        solve();

    }

    return 0;

}

 

你可能感兴趣的:(ant)