Submission #1019827

#TimeUsernameProblemLanguageResultExecution timeMemory
1019827AndreyFurniture (JOI20_furniture)C++14
100 / 100
1046 ms74832 KiB
#include<bits/stdc++.h> using namespace std; int n,m; int haha[1001][1001]; int bruh[1001][1001]; int wow[1001][1001]; int idk[1001][1001]; vector<int> sm(2000,INT_MAX); vector<int> big(2000,-1); vector<int> segs(5000); vector<int> segb(5000); set<int> no[1001]; void build(int l, int r, int x) { if(l == r) { segs[x] = sm[l]; segb[x] = big[l]; return; } int mid = (l+r)/2; build(l,mid,x*2); build(mid+1,r,x*2+1); segb[x] = max(segb[x*2],segb[x*2+1]); segs[x] = min(segs[x*2],segs[x*2+1]); } int calc(int l, int r, int ql, int qr, int x, bool yeah) { if(l == ql && r == qr) { if(yeah) { return segb[x]; } else { return segs[x]; } } int mid = (l+r)/2; if(qr <= mid) { return calc(l,mid,ql,qr,x*2,yeah); } else if(ql > mid) { return calc(mid+1,r,ql,qr,x*2+1,yeah); } else { int a = calc(l,mid,ql,mid,x*2,yeah); int b = calc(mid+1,r,mid+1,qr,x*2+1,yeah); if(yeah) { return max(a,b); } else { return min(a,b); } } } void upd(int l, int r, int p, int x) { if(l == r) { segb[x] = big[p]; segs[x] = sm[p]; return; } int mid = (l+r)/2; if(p <= mid) { upd(l,mid,p,x*2); } else { upd(mid+1,r,p,x*2+1); } segb[x] = max(segb[x*2],segb[x*2+1]); segs[x] = min(segs[x*2],segs[x*2+1]); } void dfs1(int x, int y, bool yeah) { if(!yeah) { if(x < 0 || x >= n || y < 0 || y >= m) { return; } if(bruh[x][y] == 0) { return; } if(x > 0 && bruh[x-1][y]) { return; } if(y > 0 && bruh[x][y-1]) { return; } } bruh[x][y] = 0; idk[x][y] = 0; no[y].erase(x); sm[y] = *no[y].lower_bound(0); big[y] = *(--no[y].upper_bound(n-1)); upd(0,m-1,y,1); dfs1(x+1,y,false); dfs1(x,y+1,false); } void dfs2(int x, int y, bool yeah) { if(!yeah) { if(x < 0 || x >= n || y < 0 || y >= m) { return; } if(wow[x][y] == 0) { return; } if(x < n-1 && wow[x+1][y]) { return; } if(y < m-1 && wow[x][y+1]) { return; } } wow[x][y] = 0; idk[x][y] = 0; no[y].erase(x); sm[y] = *no[y].lower_bound(0); big[y] = *(--no[y].upper_bound(n-1)); upd(0,m-1,y,1); dfs2(x-1,y,false); dfs2(x,y-1,false); } int main() { ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> haha[i][j]; } } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { bruh[i][j] = 0; if(i > 0 && bruh[i-1][j]) { bruh[i][j] = 1; } if(j > 0 && bruh[i][j-1]) { bruh[i][j] = 1; } if(haha[i][j] == 1) { bruh[i][j] = 0; } if(i == 0 && j == 0) { bruh[i][j] = 1; } } } for(int i = n-1; i >= 0; i--) { for(int j = m-1; j >= 0; j--) { wow[i][j] = 0; if(i < n-1 && wow[i+1][j]) { wow[i][j] = 1; } if(j < m-1 && wow[i][j+1]) { wow[i][j] = 1; } if(haha[i][j] == 1) { wow[i][j] = 0; } if(i == n-1 && j == m-1) { wow[i][j] = 1; } } } for(int i = 0; i < m; i++) { no[i].insert(-1); no[i].insert(n); } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { idk[i][j] = (bruh[i][j]&wow[i][j]); if(idk[i][j]) { sm[j] = min(sm[j],i); big[j] = max(big[j],i); no[j].insert(i); } } } build(0,m-1,1); int q; cin >> q; for(int i = 0; i < q; i++) { int x,y; cin >> x >> y; x--; y--; if((y == 0 || calc(0,m-1,0,y-1,1,true) <= x) && (y == m-1 || calc(0,m-1,y+1,m-1,1,false) >= x)) { cout << 0 << "\n"; } else { cout << 1 << "\n"; dfs1(x,y,true); dfs2(x,y,true); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...