SRM411 div2 hard
最大でも200*200程度の大きさでしかないので
座標を全てメモリにとってシュミレーション。
#include <vector> #include <queue> #define OFFSET 100 using namespace std; class HoleCakeCuts { public: int cake[201][201]; int cutTheCake(int cakeLength, int holeLength, vector <int> horizontalCuts, vector <int> verticalCuts) { for(int x=-100;x<=100;x++) for(int y=-100;y<=100;y++) cake[x+OFFSET][y+OFFSET]=-2; for(int x=-cakeLength;x<cakeLength;x++) for(int y=-cakeLength;y<cakeLength;y++) cake[x+OFFSET][y+OFFSET]=0; for(int x=-holeLength;x<holeLength;x++) for(int y=-holeLength;y<holeLength;y++) cake[x+OFFSET][y+OFFSET]=-2; for(int i=0;i<horizontalCuts.size();i++) for(int x=-100;x<=100;x++) for(int y=-100;y<=100;y++) if(cake[x+OFFSET][y+OFFSET]!=-2 && horizontalCuts[i]<=y) cake[x+OFFSET][y+OFFSET]++; for(int i=0;i<verticalCuts.size();i++) for(int x=-100;x<=100;x++) for(int y=-100;y<=100;y++) if(cake[x+OFFSET][y+OFFSET]!=-2 && verticalCuts[i]<=x) cake[x+OFFSET][y+OFFSET]++; /*for(int y=-10;y<=10;y++) { for(int x=-10;x<=10;x++) printf("%3d",cake[x+OFFSET][y+OFFSET]); printf("\n"); } printf("\n");*/ int ans=0; for(int sx=0;sx<=200;sx++) for(int sy=0;sy<=200;sy++) if(cake[sx][sy]!=-2) { ans++; int color=cake[sx][sy]; int mv[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; queue<int> que; que.push(sx*300+sy); while(!que.empty()) { int x=que.front()/300; int y=que.front()%300; que.pop(); if(x<0 || 200<x || y<0 || 200<y) continue; if(cake[x][y]!=color) continue; cake[x][y]=-2; for(int i=0;i<4;i++) { int xx=x+mv[i][0]; int yy=y+mv[i][1]; que.push(xx*300+yy); } } } return ans; } };