POJ1151 Atlantis [离散化]

题意:

求矩形合并的总面积。

思路:

想练一下离散化专门找的题目。

很好的一道题,没用线段树,因为N=100,所以直接离散化则可以O(N^2)求出。


更具体的可以参看下面链接:

http://www.cppblog.com/RyanWang/archive/2009/02/22/74612.html


#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
const int N=105;
double rect[N][4];
int n;
double X[N<<1];
double Y[N<<1];
int XY[N<<1][N<<1];
int cases=1;
void solve()
{
	memset(XY,0,sizeof(XY));
	for(int k=1;k<=n;k++)
	{
		int x1,y1,x2,y2;
		for(int i=1;i<=(n<<1);i++)
		{
			if(X[i]==rect[k][0])
			{
				x1=i;
				break;
			}
		}
		for(int i=1;i<=(n<<1);i++)
		{
			if(X[i]==rect[k][2])
			{
				x2=i;
				break;
			}
		}
		for(int i=1;i<=(n<<1);i++)
		{
			if(Y[i]==rect[k][1])
			{
				y1=i;
				break;
			}
		}
		for(int i=1;i<=(n<<1);i++)
		{
			if(Y[i]==rect[k][3])
			{
				y2=i;
				break;
			}
		}
		for(int i=x1;i<x2;i++)//注意这里是小于号
			for(int j=y1;j<y2;j++)
			{
				XY[i][j]=1;
			}

	}
	double ans=0;
	for(int i=1;i<=(n<<1);i++)
		for(int j=1;j<=(n<<1);j++)
		{
			ans+=XY[i][j]*(X[i+1]-X[i])*(Y[j+1]-Y[j]);
		}
	printf("Test case #%d\n",cases++);
	printf("Total explored area: %.2lf\n\n",ans);
}
int main()
{
	while(scanf("%d",&n),n)
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%lf%lf%lf%lf",rect[i],rect[i]+1,rect[i]+2,rect[i]+3);
			X[(i<<1)-1]=rect[i][0];
			X[(i<<1)]=rect[i][2];
			Y[(i<<1)-1]=rect[i][1];
			Y[(i<<1)]=rect[i][3];
		}
		sort(X+1,X+(n<<1)+1);
		sort(Y+1,Y+(n<<1)+1);
		solve();
	}
	return 0;
}


你可能感兴趣的:(POJ1151 Atlantis [离散化])