题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1147
题意:一个10000*10000的矩阵,初始颜色都为1,然后最多2500次涂色,每次涂色将一个矩形的面积涂成某个特定颜色,问涂完之后每种颜色最终的面积。
解法:倒序计算,矩形切割
代码:
/****************************************************** * @author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <string.h> //freopen ("in.txt" , "r" , stdin); using namespace std; #define eps 1e-8 #define zero(_) (abs(_)<=eps) const double pi=acos(-1.0); typedef long long LL; const int Max=2510; const int INF=1e9+7; struct rec { int x1,x2,y1,y2; int color; } recs[Max]; int A,B; int n; int getans(int x1,int x2,int y1,int y2,int p) { while((p<=n)&&(x1>=recs[p].x2||x2<=recs[p].x1||y1>=recs[p].y2||y2<=recs[p].y1)) p++; if(p>n) return (x2-x1)*(y2-y1); int ans=0; if(x1<recs[p].x1) ans+=getans(x1,recs[p].x1,y1,y2,p+1),x1=recs[p].x1; if(x2>recs[p].x2) ans+=getans(recs[p].x2,x2,y1,y2,p+1),x2=recs[p].x2; if(y2>recs[p].y2) ans+=getans(x1,x2,recs[p].y2,y2,p+1),y2=recs[p].y2; if(y1<recs[p].y1) ans+=getans(x1,x2,y1,recs[p].y1,p+1); return ans; } int ans[Max]; int main() { while(~scanf("%d%d%d",&A,&B,&n)) { memset(ans,0,sizeof ans); for(int i=1; i<=n; i++) { scanf("%d%d%d%d%d",&recs[i].x1,&recs[i].y1,&recs[i].x2,&recs[i].y2,&recs[i].color); } ans[1]=A*B; for(int i=n; i>=1; i--) { int tool=getans(recs[i].x1,recs[i].x2,recs[i].y1,recs[i].y2,i+1); ans[recs[i].color]+=tool; ans[1]-=tool; } for(int i=1; i<=2500; i++) if(ans[i]) printf("%d %d\n",i,ans[i]); } return 0; } /* 20 20 3 2 2 18 18 2 0 8 19 19 3 8 0 10 19 4 */
ural1147(Shaping Regions)矩形切割,布布扣,bubuko.com
时间: 2024-10-11 10:21:16