[题解]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;}
- [题解]hdu1542 Atlantis
- POJ1151 HDU1542 CODEVS3044 Atlantis 题解&代码
- hdu1542 Atlantis
- HDU1542--Atlantis
- [HDU1542]Atlantis
- hdu1542----Atlantis
- hdu1542 Atlantis
- hdu1542 Atlantis
- hdu1542 Atlantis 面积交
- HDU1542 Atlantis(面积并)
- 线段树 hdu1542 Atlantis
- HDU1542 Atlantis (扫描线)
- hdu1542 Atlantis--扫描线
- HDU1542&&POJ1151-Atlantis
- hdu1542 Atlantis (线段树+扫描线)
- hdu1542 Atlantis(矩形面积并)
- HOJ1119/HDU1542 Atlantis HOJ1909/POJ1177 Picture
- 面积并---扫描线 hdu1542 Atlantis
- 最大子序列和问题 hdu1231
- JavaScript的Ajax以及中文乱码问题
- objc[8715]: Class JavaLaunchHelper is implemented in both...
- Passing file descriptor
- python基础--文件操作实现全文或单行替换
- [题解]hdu1542 Atlantis
- 前端拖拽插件gridster.js介绍与使用示例
- java实现时间复杂度O(1)的LFU缓存
- 内置的验证约束注解
- C++ 判断文件文件夹是否存在
- 最近点对模版
- Hibernate错误记录(一): Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPe
- Gh0st 3.6 存在的BUG及修改方法(收集整理)
- 实验一下CSDN的公开时间