好像某年有个亚洲区的题和这个很像,在屏幕上的矩形的覆盖,不过那个题最多有26个矩形,可以暴力求解,比这个还简单了。
/*
ID:jzzlee1
PROB:rect1
LANG:C++
*/
//#include<iostream>
#include<fstream>
using namespace std;
ifstream cin("rect1.in");
ofstream cout("rect1.out");
long int x1[1010],y1[1010],x2[1010],y2[1010],ans[2510],c[2510];
int n,maxc;
void color(int l,int r,int s,int d,int k,int col)
{
while( (k<=n)&&((l>=x2[k])||(r<=x1[k])||(d<=y1[k])||s>=y2[k]) )
k++;
if( k>n )
{
ans[col]+=(r-l)*(d-s);
return;
}
else
{
if(l<=x1[k])
{
color(l,x1[k],s,d,k+1,col);
l=x1[k];
}
if(r>=x2[k])
{
color(x2[k],r,s,d,k+1,col);
r=x2[k];
}
if(s<=y1[k])
{
color(l,r,s,y1[k],k+1,col);
s=y1[k];
}
if(d>=y2[k])
{
color(l,r,y2[k],d,k+1,col);
d=y2[k];
}
}
}
void work()
{
int i,j;
cin>>x2[0]>>y2[0]>>n;
x1[0]=0;
y1[0]=0;
c[0]=1;
maxc=0;
for(i=1;i<=n;i++)
{
cin>>x1[i]>>y1[i]>>x2[i]>>y2[i]>>c[i];
if(c[i]>maxc)
maxc=c[i];
}
for(i=n;i>=0;i--)
color(x1[i],x2[i],y1[i],y2[i],i+1,c[i]);
for(i=1;i<=maxc;i++)
if(ans[i]!=0)
cout<<i<<" "<<ans[i]<<endl;
}
int main()
{
work();
return 0;
}