#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 205 //自己写了一个cin的流输入,果断地WA,maxn最好大于150,因为之间重复可能大于100 int colors[maxn],n,m; int x[maxn],y[maxn],lenx,leny,map[10005][10005]; struct rect{ int x[2],y[2]; int p; }; rect matirx[maxn]; void fucks(int &k){ for(int i=0;i<2;i++){ int dx=matirx[k].x[i],dy=matirx[k].y[i]; x[lenx++]=dx; y[leny++]=dy; } } void refucks(){ int tx=0,ty=0,i=1,j=1; while(i<lenx){ if(x[i]!=x[i-1]) x[++tx]=x[i]; i++; } while(j<leny){ if(y[j]!=y[j-1]) y[++ty]=y[j]; j++; } lenx=tx+1,leny=ty+1; } void getpt(){ int i,j; for(i=0;i<lenx;i++) for(j=0;j<leny;j++) map[i][j]=0; } void panit( int &t){ for(int i=0;i<t;i++){ int px[2]={lower_bound(x,x+lenx,matirx[i].x[0])-x,lower_bound(x,x+lenx,matirx[i].x[1])-x}; //二分查找关键值在数组中的位置 int py[2]={lower_bound(y,y+leny,matirx[i].y[0])-y,lower_bound(y,y+leny,matirx[i].y[1])-y}; for(int j=px[0];j<px[1];j++) for(int k=py[0];k<py[1];k++) map[j][k]=matirx[i].p; } } int getnum(){ int sum=0; for(int i=0;i<lenx-1;i++){ //再离散后的坐标中寻找着色点矩形框 for(int j=0;j<leny-1;j++){ colors[map[i][j]]+=(x[i+1]-x[i])*(y[j+1]-y[j]); } } for(int k=1;k<=100;k++){ if(colors[k]){ cout<<k<<" "<<colors[k]<<endl; sum++; } } //注意输入输出 if(sum<=1) cout<<"There is "<<sum<<" color left on the wall."<<endl; else cout<<"There are "<<sum<<" colors left on the wall."<<endl; return sum; } int main(){ int t,i,j; int Case=0; while( scanf("%d%d",&n,&m) && (n+m)){ if(Case) putchar('\n'); Case++; scanf("%d",&t); memset(colors,0,sizeof(colors)); lenx=leny=0; for(i=0;i<t;i++){ for(j=0;j<2;j++) scanf("%d%d",&matirx[i].x[j],&matirx[i].y[j]); scanf("%d",&matirx[i].p); fucks(i);//数据存入离散数组 } sort(x,x+lenx); sort(y,y+leny); refucks();//数组排重 printf("Case %d:\n",Case); getpt(); panit(t); getnum(); } return 0; }