题目大意:一块高为h,宽为m的墙,在墙上涂上不同颜色的矩形,求经过一系列操作后每种颜色相应的面积和颜色种数。需要注意的是输出时要判断颜色种数,如果是1或0要用is,否则用are(这里害我wa了好几次)。-_-!
思路:离散化。
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 int a[205][205]; 6 struct 7 { 8 int x,y; 9 }bottomleft[105],topright[105]; 10 int col[205]; 11 int xx[205]; 12 int yy[205]; 13 int area[105]; 14 int binsearch(int kk[],int l,int r,int key) 15 { 16 int m=(l+r)>>1; 17 if(kk[m]==key) 18 return m; 19 if(kk[m]>key) 20 return binsearch(kk,l,m-1,key); 21 return binsearch(kk,m+1,r,key); 22 } 23 void paint(int l1,int l2,int r1,int r2,int c) 24 { 25 int i,j; 26 for(i=r1;i<r2;i++) 27 for(j=l1;j<l2;j++) 28 a[i][j]=c; 29 } 30 void cal(int k1,int k2) 31 { 32 int i,j; 33 for(i=1;i<k2;i++) 34 for(j=1;j<k1;j++) 35 if(a[i][j]) 36 area[a[i][j]]+=(xx[j+1]-xx[j])*(yy[i+1]-yy[i]); 37 } 38 int main() 39 { 40 int h,w,cas=1; 41 while(scanf("%d%d",&h,&w)&&(h||w)){ 42 int n,i,k1=1,k2=1; 43 scanf("%d",&n); 44 for(i=0;i<n;i++){ 45 scanf("%d%d%d%d%d",&bottomleft[i].x,&bottomleft[i].y,&topright[i].x,&topright[i].y,col+i); 46 xx[k1++]=bottomleft[i].x; 47 xx[k1++]=topright[i].x; 48 yy[k2++]=bottomleft[i].y; 49 yy[k2++]=topright[i].y; 50 } 51 if(cas!=1) 52 printf("\n"); 53 sort(xx+1,xx+k1); 54 sort(yy+1,yy+k2); 55 int m=2; 56 for(i=2;i<k1;i++) 57 if(xx[i]!=xx[i-1]) 58 xx[m++]=xx[i]; 59 k1=m; 60 m=2; 61 for(i=2;i<k2;i++) 62 if(yy[i]!=yy[i-1]) 63 yy[m++]=yy[i]; 64 k2=m; 65 memset(a,0,sizeof(a)); 66 memset(area,0,sizeof(area)); 67 for(i=0;i<n;i++){ 68 int l1=binsearch(xx,1,k1-1,bottomleft[i].x); 69 int l2=binsearch(xx,1,k1-1,topright[i].x); 70 int r1=binsearch(yy,1,k2-1,bottomleft[i].y); 71 int r2=binsearch(yy,1,k2-1,topright[i].y); 72 paint(l1,l2,r1,r2,col[i]); 73 } 74 cal(k1,k2); 75 int cnt=0; 76 printf("Case %d:\n",cas++); 77 for(i=1;i<101;i++) 78 if(area[i]){ 79 printf("%d %d\n",i,area[i]); 80 cnt++; 81 } 82 if(cnt<=1) 83 printf("There is %d color left on the wall.\n",cnt); 84 else 85 printf("There are %d colors left on the wall.\n",cnt); 86 } 87 }