UVA 11345 Rectangles

一看这题,以为又是求矩形并呢。。。正好离散化又不熟。。就写写看。

反正比写zoj1128好多了。

但是又一看,是求所有矩形共同覆盖的面积。那么就是所有矩形的交了。我的map数组存的是当前点被多少个矩形覆盖。最后只要算被N个矩形覆盖的面积即可。

纯练手。。。我想知道C++里有没有二分查找返回位置的。。。哎。。怎么都是返回迭代器啊。。不会啊。。。


#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>

using namespace std;

const int MAX = 35*2;
const double eps = 1e-6;
bool dy(double x,double y)	{	return x > y + eps;}	// x > y 
bool xy(double x,double y)	{	return x < y - eps;}	// x < y 
bool dyd(double x,double y)	{ 	return x > y - eps;}	// x >= y 
bool xyd(double x,double y)	{	return x < y + eps;} 	// x <= y 
bool dd(double x,double y) 	{	return fabs( x - y ) < eps;}  // x == y
double x[MAX];
double y[MAX];
struct rectangle{ double lx,ly,rx,ry;};
rectangle r[35];
int map[MAX][MAX];
int find(double a[],int m,double x)  
{  
    int beg = 0,end = m-1;  
    while( beg <= end )  
    {  
        int mid = (beg+end) >> 1;  
        if( dd(x,a[mid]) )  
            return mid;  
        if( dy(x,a[mid]) )  
            beg = mid + 1;  
        else  
            end = mid;  
    }  
}  
double solve(int n,int cnt)
{
	for(int i=0; i<n; i++)
	{
		int x1 = find(x,cnt,r[i].lx);
		int x2 = find(x,cnt,r[i].rx);
		int y1 = find(y,cnt,r[i].ly);
		int y2 = find(y,cnt,r[i].ry);
		for(int k=x1; k<x2; k++)
			for(int j=y1; j<y2; j++)
				map[k][j]++;
	}
	double area = 0.0;
	for(int i=0; i<cnt-1; i++)
		for(int k=0; k<cnt-1; k++)
			if( map[i][k] == n )
				area += (x[i+1] - x[i])*(y[k+1] - y[k]);
	return area;
}
int main()
{
	int ncases;
	scanf("%d",&ncases);
	
	int n,cnt,ind = 1;
	while( ncases-- )
	{
		cnt = 0;
		scanf("%d",&n);
		memset(map,0,sizeof(map));
		for(int i=0; i<n; i++)
		{
			scanf("%lf%lf%lf%lf",&r[i].lx,&r[i].ly,&r[i].rx,&r[i].ry);
			x[cnt] = r[i].lx;
			y[cnt++] = r[i].ly;
			x[cnt] = r[i].rx;
			y[cnt++] = r[i].ry;
		}
		sort(x,x+cnt);
		sort(y,y+cnt);
		double ans = solve(n,cnt);
		printf("Case %d: %.0lf\n",ind++,ans);
	}

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值