您的位置:首页 > 其它

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

2017-04-14 20:18 260 查看
这道题据说是NOIP哪年哪道题???

被各大省讲烂了???

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



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

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



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

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

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

#include<cstdio> // By: Chorolop
#include<iostream>
#include<cstring>
#include<algorithm>
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Codevs 离散化