好像某年有個亞洲區的題和這個很像,在屏幕上的矩形的覆蓋,不過那個題最多有26個矩形,能夠暴力求解,比這個還簡單了。ios
/* 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; }