热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ1151Atlantis(离散化求矩形面积并)

题意:在二维平面上给出n个矩形的顶点坐标(浮点数),每个矩形的边都平行坐标轴,求矩形覆盖的面积。数据范围:n<100,0<x,y<100000分析:由于n比较小,所以用

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

数据范围:n<=100,  0=

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

View Code
#include 
#include
<string.h>
#include

#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)
{
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;iif(x[xcnt-1]!=x[i]) x[xcnt++]=x[i];


k
=ycnt;
ycnt
=0;
y[ycnt
++]=y[0];
for(i=1;iif(y[ycnt-1]!=y[i]) y[ycnt++]=y[i];

int a,b,c,d;
for(k=0;k)
{
a=bsx(xl[k]); b=bsy(yl[k]);
c
=bsx(xr[k]); d=bsy(yu[k]);
for(i=a;i)
{
for(j=b;jtrue;
}
}
double ans=0;
for(i=0;i1;i++)
{
for(j=0;j1;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;
}

 


推荐阅读
author-avatar
DZ---Shanghai
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有