【离散化练习】Codevs3044矩形面积求并
2014-11-05 13:53
204 查看
题目描述 Description
输入n个矩形,求他们总共占地面积(也就是求一下面积的并)
输入描述 Input Description
可能有多组数据,读到n=0为止(不超过15组)
每组数据第一行一个数n,表示矩形个数(n<=100)
接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标
输出描述 Output Description
每组数据输出一行表示答案
样例输入 Sample Input
210 10 20 2015 15 25 25.50
样例输出 Sample Output
180.00
对于 这个题,如果数据范围小的话当然可以采用对点染色的方法计算面积,但是100个矩形,100000×100000,15组数据下这种做法是一定会超时的。
于是我们想到对这个题进行离散,离散出来矩形的各个点的横坐标纵坐标,将其分割,最后进行并运算。
对于每个点,判断是不是在矩形覆盖的范围内,然后对于覆盖了的点进行运算。
纪念离散第一题。
输入n个矩形,求他们总共占地面积(也就是求一下面积的并)
输入描述 Input Description
可能有多组数据,读到n=0为止(不超过15组)
每组数据第一行一个数n,表示矩形个数(n<=100)
接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标
输出描述 Output Description
每组数据输出一行表示答案
样例输入 Sample Input
210 10 20 2015 15 25 25.50
样例输出 Sample Output
180.00
对于 这个题,如果数据范围小的话当然可以采用对点染色的方法计算面积,但是100个矩形,100000×100000,15组数据下这种做法是一定会超时的。
于是我们想到对这个题进行离散,离散出来矩形的各个点的横坐标纵坐标,将其分割,最后进行并运算。
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> bool p[201][201]; main() { short n2,n,i,j,sumx,sumy,k; double l[100],d[100],r[100],u[100],y[200],x[200],ans; scanf("%hd",&n); while(n) { ans=0; memset(p,0,sizeof(p)); for(i=-1;++i<n;) { scanf("%lf%lf%lf%lf",&l[i],&d[i],&r[i],&u[i]); y[i]=d[i]; y[i+n]=u[i]; x[i]=l[i]; x[i+n]=r[i]; } n2=2*n; sort(y,y+n2); sort(x,x+n2); sumx=unique(x,x+n2)-x,sumy=unique(y,y+n2)-y; for(k=-1;++k<n;) { l[k]=lower_bound(x,x+sumx,l[k])-x; r[k]=lower_bound(x,x+sumx,r[k])-x; u[k]=lower_bound(y,y+sumy,u[k])-y; d[k]=lower_bound(y,y+sumy,d[k])-y; for(i=r[k];i>l[k];--i) for(j=u[k];j>d[k];--j) p[i][j]=1; } for(i=0;++i<sumx;) for(j=0;++j<sumy;) if(p[i][j]) ans+=(x[i]-x[i-1])*(y[j]-y[j-1]); printf("%.2lf\n",ans); scanf("%hd",&n); } }
对于每个点,判断是不是在矩形覆盖的范围内,然后对于覆盖了的点进行运算。
纪念离散第一题。
相关文章推荐
- codevs 3044 线段树+离散化+扫描线 (矩形面积并
- [Codevs] 3044 矩形面积求并(离散化)
- codevs3044 矩形面积求并(线段数+扫描线+离散化)
- 【codevs3044】矩形面积求并&&【POJ1151】Atlantis,第一次的扫描线
- (codevs 3044 矩形面积求并)<可以不用线段树>
- codevs3044 矩形面积求并
- [codevs3044]矩形面积求并(线段树+扫描线)
- 【codevs3044】矩形面积求并
- Codevs P3044矩形面积求并
- codevs 3044 矩形面积求并
- 矩形面积求并(codevs 3044)
- codevs 3044 矩形面积求并 (扫描线)
- 【POJ1177】【HDU1828】【codevs2149】矩形面积周长并
- 【基础练习】【线性DP+离散化】codevs1105 过河题解
- 【codevs 3044】 矩形面积求并 【线段树 扫描线 离散化】
- Codevs 题目3044 矩形面积求并(线段树+扫描线+离散化)
- 【基础练习】【离散化+逆序对】codevs3286 火柴排队题解
- CODEVS4633 [Mz]树链剖分练习
- [codevs] 线段树练习4
- codevs 4244 平衡树练习