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

来源:互联网 发布:linux posix 编辑:程序博客网 时间:2024/04/30 19:26

这道题据说是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;}



0 0