[Codevs] 3044 矩形面积求并(离散化)

这道题据说是NOIP哪年哪道题???

被各大省讲烂了???


--------------------------------------------

[Codevs] 3044 矩形面积求并(离散化)_第1张图片

首先大致思路如上所示:以一个点代表其右上的一个单位。这个单位矩形的某种不可名状性质如右上所示。这样,数组xy[c][c]就代表了c+1到c这个小矩形是否被覆盖了,然后我们在涂点的时候就涂少一个单位,这样小矩形合起来刚好就能代表整个大矩形,然后我们用这个方法求出所有覆盖面积(就是一群矩形);


但是呢这道题的重点其实是在 离 散 化


离散化的代码相信很容易就能从下列代码中被识别出来,具体方式就是利用映射数组,将 元素 映射为下标


其实后来发现这道题很容易= =可能是我搞的时间略长,,


题目:http://codevs.cn/problem/3044/

#include // By: Chorolop
#include
#include
#include
using namespace std;

double x[300],y[300],xy[300][300],ans;
double s[300][4];
int n,k = 1;

void _init()
{
	memset(x,0,sizeof(x));
	memset(y,0,sizeof(y));
	memset(xy,0,sizeof(xy));
	memset(s,0,sizeof(s));
	ans = 0;
	k = 1;
}

int main()
{
	scanf("%d",&n);
	
	while(n)	
	{
		_init();
		
		for(int i = 1;i <= n;i++)
		{
			scanf("%lf %lf %lf %lf",&s[i][0],&s[i][1],&s[i][2],&s[i][3]);

			x[k] = s[i][0];
			y[k] = s[i][1];
			k++;
			x[k] = s[i][2];
			y[k] = s[i][3];
			k++;
		}
		
		sort(x+1,x+k);
		sort(y+1,y+k);
		
		for(int i = 1;i <= n;i++)
		{
			int ix,iy,jx,jy;	
			for(ix = 0;x[ix] < s[i][0];ix++);
			for(iy = 0;y[iy] < s[i][1];iy++);
			for(jx = 0;x[jx] < s[i][2];jx++);
			for(jy = 0;y[jy] < s[i][3];jy++);
			
			for(int px = ix;px < jx;px++)
				for(int py = iy;py < jy;py++)
					xy[px][py] = 1;
		}
		
		for(int px = 0;px <= k;px++)
			for(int py = 0;py <= k;py++)
				ans += xy[px][py] * (x[px+1]-x[px]) * (y[py+1]-y[py]);
				
		printf("%.2lf\n",ans);
		
		scanf("%d",&n);
	}
	return 0;
}



你可能感兴趣的:(OI-几何)