Submission #402529

#TimeUsernameProblemLanguageResultExecution timeMemory
402529rqiFurniture (JOI20_furniture)C++14
0 / 100
9 ms844 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pi; #define mp make_pair #define f first #define s second #define pb push_back #define sz(x) (int)(x).size() const int mx = 1005; int N, M; bool C[mx][mx]; bool disap[mx][mx]; pi deg[mx][mx];//leftup, rightdown degree queue<pi> to_remove; int maxrow[mx]; int maxcol[mx]; void subDeg(int X, int Y, bool typ){ if(C[X][Y] || disap[X][Y]) return; if(mp(X, Y) == mp(1, 1) || mp(X, Y) == mp(N, M)) return; if(typ == 0){ deg[X][Y].f--; } else{ deg[X][Y].s--; } if(deg[X][Y].f == 0 || deg[X][Y].s == 0){ to_remove.push(mp(X, Y)); disap[X][Y] = 1; } } void removeToRemoves(){ while(sz(to_remove)){ pi coor = to_remove.front(); to_remove.pop(); disap[coor.f][coor.s] = 0; C[coor.f][coor.s] = 1; subDeg(coor.f-1, coor.s, 1); subDeg(coor.f, coor.s-1, 1); subDeg(coor.f+1, coor.s, 0); subDeg(coor.f, coor.s+1, 0); } } void updateMaxes(int X, int Y){ while(maxrow[X]+1 <= M){ if(C[X][maxrow[X]+1]){ maxrow[X]++; continue; } else{ break; } } while(maxcol[Y]+1 <= N){ if(C[maxcol[Y]+1][Y]){ maxcol[Y]++; continue; } else{ break; } } } int main(){ cin >> N >> M; for(int i = 1; i <= N; i++){ for(int j = 1; j <= M; j++){ cin >> C[i][j]; } } for(int i = 0; i <= N+1; i++){ C[i][0] = C[i][M+1] = 1; } for(int i = 0; i <= M+1; i++){ C[0][i] = C[N+1][i] = 1; } for(int i = 1; i <= N; i++){ for(int j = 1; j <= M; j++){ if(mp(i, j) == mp(1, 1) || mp(i, j) == mp(N, M)) continue; if(C[i][j]) continue; deg[i][j].f+=(int)(!C[i-1][j])+(int)(!C[i][j-1]); deg[i][j].s+=(int)(!C[i+1][j])+(int)(!C[i][j+1]); if(deg[i][j].f == 0 || deg[i][j].s == 0){ to_remove.push(mp(i, j)); disap[i][j] = 1; } } } int Q; cin >> Q; for(int i = 1; i <= Q; i++){ //cout << "QUERY: " << i << "\n"; int X, Y; cin >> X >> Y; removeToRemoves(); updateMaxes(X+1, Y+1); // for(int i = 1; i <= N; i++){ // for(int j = 1; j <= M; j++){ // cout << C[i][j] << " "; // } // cout << "\n"; // } // cout << "\n"; // for(int i = 1; i <= N; i++){ // for(int j = 1; j <= M; j++){ // cout << deg[i][j].f << " "; // } // cout << "\n"; // } // cout << "\n"; // for(int i = 1; i <= N; i++){ // for(int j = 1; j <= M; j++){ // cout << deg[i][j].s << " "; // } // cout << "\n"; // } // cout << "\n"; if(C[X][Y] == 0 && maxrow[X+1] >= Y-1 && maxcol[Y+1] >= X-1){ cout << 0 << "\n"; } else{ cout << 1 << "\n"; to_remove.push(mp(X, Y)); disap[X][Y] = 1; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...