Submission #623112

#TimeUsernameProblemLanguageResultExecution timeMemory
623112S2speedFurniture (JOI20_furniture)C++17
100 / 100
1091 ms113536 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize ("Ofast") #define sze(x) (ll)(x.size()) typedef long long ll; typedef pair<ll , ll> pll; const ll maxn = 1e3 + 17 , maxv = 1e6 + 17; ll n , m; set<ll> r[maxn] , c[maxn]; bitset<maxn> a[maxn] , z[maxn] , b[maxn]; vector<pll> v; void del(ll i , ll j){ if(!a[i][j]) return; v.clear(); v.push_back({i , j}); a[i][j] = false; ll x = 0; while(x < sze(v)){ ll i = v[x].first , j = v[x++].second; r[i].erase(j); c[j].erase(i); if(i < n - 1){ if(a[i + 1][j]){ if(j == 0){ a[i + 1][j] = z[i + 1][j] = false; v.push_back({i + 1 , j}); } else { if(!a[i + 1][j - 1]){ a[i + 1][j] = z[i + 1][j] = false; v.push_back({i + 1 , j}); } } } } if(j < m - 1){ if(a[i][j + 1]){ if(i == 0){ a[i][j + 1] = z[i][j + 1] = false; v.push_back({i , j + 1}); } else { if(!a[i - 1][j + 1]){ a[i][j + 1] = z[i][j + 1] = false; v.push_back({i , j + 1}); } } } } } if(!z[i][j]) return; z[i][j] = false; v.clear(); v.push_back({i , j}); x = 0; while(x < sze(v)){ ll i = v[x].first , j = v[x++].second; r[i].erase(j); c[j].erase(i); if(i){ if(z[i - 1][j]){ if(!z[i - 1][j + 1]){ z[i - 1][j] = false; v.push_back({i - 1 , j}); } } } if(j){ if(z[i][j - 1]){ if(!z[i + 1][j - 1]){ z[i][j - 1] = false; v.push_back({i , j - 1}); } } } } return; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(ll i = 0 ; i < n ; i++){ for(ll j = 0 ; j < m ; j++){ a[i][j] = z[i][j] = true; r[i].insert(j); c[j].insert(i); } } for(ll i = 0 ; i < n ; i++){ for(ll j = 0 ; j < m ; j++){ bool f; cin>>f; b[i][j] = f; if(f){ del(i , j); } } } ll q; cin>>q; for(ll e = 0 ; e < q ; e++){ ll i , j; cin>>i>>j; i--; j--; if(b[i][j]){ cout<<"0\n"; continue; } bool f = false; if(i){ auto it = r[i - 1].upper_bound(j); f |= (it != r[i - 1].end()); } if(j){ auto it = c[j - 1].upper_bound(i); f |= (it != c[j - 1].end()); } if(!f){ cout<<"0\n"; continue; } b[i][j] = true; del(i , j); cout<<"1\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...