Submission #1005124

#TimeUsernameProblemLanguageResultExecution timeMemory
1005124thelepiFurniture (JOI20_furniture)C++17
5 / 100
5079 ms63536 KiB
#include <iostream> #include <bitset> #include <cassert> #include <map> using namespace std; int n, m; bitset<1000> done[1000]{}; bitset<1000> path[1000]{}; map<pair<int, int>, bool> chdone; void erasePath(int x, int y){ while(x < m - 1 || y < n - 1){ if(x < m - 1 && path[y][x + 1]){ x++; path[y][x] = false; } else { assert((y < n - 1 && path[y + 1][x])); y++; path[y][x] = false; } } } bool findPath(int x, int y, int startx, int starty, bool erase){ if(done[y][x] || chdone[pair<int, int>{x, y}]) return false; if(x == m - 1 && y == n - 1){ if(erase) erasePath(startx, starty); path[y][x] = true; return true; } if(x == m - 1){ if(findPath(x, y + 1, startx, starty, erase)){ path[y][x] = true; return true; } else { chdone[pair<int, int>{x, y}] = true; return false; } } if(findPath(x + 1, y, startx, starty, erase)){ path[y][x] = true; return true; } if(y == n - 1){ chdone[pair<int, int>{x, y}] = true; return false; } if(findPath(x, y + 1, startx, starty, erase)){ path[y][x] = true; return true; } chdone[pair<int, int>{x, y}] = true; return false; } void apply(){ for(auto it = chdone.begin(); it != chdone.end(); it++){ done[it->first.second][it->first.first] = it->second; } chdone.clear(); } int main(int, char**){ cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int c; cin >> c; done[i][j] = c == 1; } } findPath(0, 0, 0, 0, false); int q; cin >> q; for (int i = 0; i < q; i++) { int x, y; cin >> y >> x; x--; y--; if(!path[y][x]){ done[y][x] = true; cout << "1" << "\n"; continue; } chdone.clear(); chdone[pair<int, int>{x, y}] = true; if(!findPath(0, 0, 0, 0, true)){ cout << "0" << "\n"; continue; } else{ cout << "1" << "\n"; apply(); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...