好像某年有个亚洲区的题和这个很像,在屏幕上的矩形的覆盖,不过那个题最多有26个矩形,可以暴力求解,比这个还简单了。
/*ID:jzzlee1PROB:rect1LANG:C++*///#include#include 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< <<" "< <