hdu 1543 Paint the Wall

题意:有一面h*w的墙(0<h,w<=10000),先后往墙上刷n个矩形,给出坐标和颜色c(1=<c<=100),后刷的会覆盖先前刷的(如果重合),求最后墙上剩下的颜色及对应面积。

由于矩形数量最多只有100个,所以离散化后可以暴力。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <map>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int M = 10005;
 8 const int N = 105;
 9 
10 struct Rec
11 {
12     int top, left, bottom, right, color;
13 }rec[N];
14 int Y[2*N], X[2*N], aa[2*N][2*N], ans[N], indexx, indexy, xx, yy;
15 
16 int main()
17 {
18     int Case = 1;
19     int h, w, n, top, left, bottom, right;
20     while(scanf("%d%d",&h,&w)!=EOF)
21     {
22         if(h==0 && w==0break;
23 
24         map<intint> mapx, mapy;
25         indexx = indexy = 0;
26         scanf("%d",&n);
27         for(int i=0; i<n; i++)
28         {
29             scanf("%d%d%d%d%d",&rec[i].top,&rec[i].left,&rec[i].bottom,&rec[i].right,&rec[i].color);
30             X[indexx++] = rec[i].left; X[indexx++] = rec[i].right;
31             Y[indexy++] = rec[i].top; Y[indexy++] = rec[i].bottom;
32         }
33         sort(X, X+indexx);
34         sort(Y, Y+indexy);
35         xx = 1;
36         for(int i=1; i<indexx; i++)
37             if(X[i]!=X[i-1])
38                 X[xx++] = X[i];
39         yy = 1;
40         for(int i=1; i<indexy; i++)
41             if(Y[i]!=Y[i-1])
42                 Y[yy++] = Y[i];
43         for(int i=0; i<xx; i++)
44             mapx[X[i]] = i;
45         for(int i=0; i<yy; i++)
46             mapy[Y[i]] = i;
47         memset(aa, 0sizeof(aa));
48         for(int i=0; i<n; i++)
49         {
50             top = mapy[rec[i].top]; left = mapx[rec[i].left];
51             bottom = mapy[rec[i].bottom]; right = mapx[rec[i].right];
52             for(int j=top; j<bottom; j++)
53                 for(int k=left; k<right; k++)
54                     {aa[j][k] = rec[i].color;}
55         }
56         memset(ans, 0sizeof(ans));
57         for(int i=0; i<yy-1; i++) //xx 与 yy换了位置,WA无数。。。
58             for(int j=0; j<xx-1; j++)
59             {
60                 int tempx1 = X[i], tempx2 = X[i+1], tempy1 = Y[j], tempy2 = Y[j+1];
61                 ans[aa[i][j]] += (tempx2 - tempx1) * (tempy2 - tempy1);
62             }
63         int sum = 0;
64         if(Case>1) printf(" ");
65         printf("Case %d: ",Case++);
66         for(int i=1; i<=100; i++)
67         {
68             if(ans[i]>0)
69             {
70                 printf("%d %d ",i, ans[i]);
71                 sum++;
72             }
73         }
74         if(sum==1)
75             printf("There is %d color left on the wall. ",sum);
76         else
77             printf("There are %d colors left on the wall. ",sum);
78     }
79     return 0;
80 }
View Code 
原文地址:https://www.cnblogs.com/byluoluo/p/3461922.html