#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;
}
hdu1543 Paint the Wall
最新推荐文章于 2024-07-29 14:00:00 发布