代码改变世界

1045. Space Management

2011-04-22 00:44  Min·zc  阅读(176)  评论(0编辑  收藏  举报

 



/*

 2  *最初的想法是使用一个二维数组,将覆盖上的面积设置为1,最后求有多少个1
 3  *但是因为没有给定坐标的范围,所以按照常理是不可以这样做的,很容易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 }