1045. Space Management
2011-04-22 00:44 Min·zc 阅读(176) 评论(0) 编辑 收藏 举报
1 /*
2 *最初的想法是使用一个二维数组,将覆盖上的面积设置为1,最后求有多少个13 *但是因为没有给定坐标的范围,所以按照常理是不可以这样做的,很容易mle
4 *看了tips说数据比较弱,所以开一个2000的数组就可以过。
5 *看了别人的阶梯报告说用离散化的做法
6 *不知道离散化是神马的请点我
7 *http://blog.csdn.net/titikdhu/archive/2010/07/11/5726810.aspx
8 *具体的思想就是离散化所有的坐标点,按照从小到大排序,然后分别求出每一个小方格的面积
9 *最后就是根据坐标分别求出1,2,3,4,5,6,7,8,9这九个小方格的面积,然后再找出出现在所求面积中的方格,将他们的面积相加就可以了
10 */11
12 #include <iostream>
13 #include <algorithm>
14 #include <memory.h>
15 using namespace std;
16 struct rec
17 {
18 int sx;
19 int sy;
20 int ex;
21 int ey;
22 };
23 rec r[510];//存储矩形的数据
24 int x[1100];//存储无重复的x坐标
25 int y[1100];//存储无重复的y坐标
26 int valu[1001][1001];//存储计算出来的所有子矩形的面积
27 int get[500][500];//存储子矩形是否要被选择
28 int temx[1100];//临时数组,中间变量
29 int temy[1100];//临时数组,中间变量
30 int cmp(const void* a,const void* b)
31 {
32 return *(int*)a>*(int*)b;//排序
33 }
34 int main()
35 {
36 int t;
37 cin>>t;
38 while(t--)
39 {
40 int n;
41 cin>>n;
42 int xl=0;
43 int yl=0;
44 memset(get,0,sizeof(get));
45 for(int i=0;i<n;i++)
46 {
47 int sx,sy,w,h;
48 cin>>sx>>sy>>w>>h;
49 r[i].sx=sx;
50 r[i].sy=sy;
51 r[i].ex=sx+w;
52 r[i].ey=sy+h;
53
54 temx[xl++]=sx;
55 temx[xl++]=sx+w;
56 temy[yl++]=sy;
57 temy[yl++]=sy+h;
58 }
59 qsort(temx,xl,sizeof(temx[0]),cmp);
60 qsort(temy,yl,sizeof(temy[0]),cmp);
61 x[0]=temx[0];
62 y[0]=temy[0];
63 int tx=1;
64 int ty=1;
65 for(int i=1;i<xl;i++)
66 {
67 if(temx[i-1]!=temx[i])
68 x[tx++]=temx[i];
69 if(temy[i-1]!=temy[i])
70 y[ty++]=temy[i];
71 }
72 for(int i=0;i<tx-1;i++)
73 for(int j=0;j<ty-1;j++)
74 valu[i][j]=(x[i+1]-x[i])*(y[j+1]-y[j]);
75
76 for(int i=0;i<tx-1;i++)
77 for(int j=0;j<ty-1;j++)
78 for(int k=0;k<n;k++)
79 if(r[k].sx<=x[i]&&r[k].ex>=x[i+1]&&r[k].sy<=y[j]&&r[k].ey>=y[j+1])
80 get[i][j]=1;
81 int ans=0;
82 for(int i=0;i<tx;i++)
83 for(int j=0;j<ty;j++)
84 if(get[i][j])
85 ans+=valu[i][j];
86 cout<<ans<<endl;
87 }
88 }