Submission #1302071

#TimeUsernameProblemLanguageResultExecution timeMemory
1302071duyanhchupapiFurniture (JOI20_furniture)C++20
100 / 100
370 ms6272 KiB
#include <bits/stdc++.h>
using namespace std; 
using ll = long long; 
const int N = 1002, inf = 2e9;
int n, m, q;
bool c[N][N], pf[N][N], sf[N][N], only[N][N];

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int main() { 
	ios_base::sync_with_stdio(0); cin.tie(0);
	// freopen(".INP", "r", stdin);
	// freopen(".OUT", "w", stdout);
	cin >> n >> m;
	for (int i=1;i<=n;++i) {
		for (int j=1;j<=m;++j) cin >> c[i][j];
	}
	
	pf[1][1] = 1;
	for (int i=1;i<=n;++i) {
		for (int j=1;j<=m;++j) {
			if (pf[i][j]) {
				if (!c[i + 1][j]) pf[i + 1][j] = 1;
				if (!c[i][j + 1]) pf[i][j + 1] = 1;
			}
		}
	} 
	
	sf[n][m] = 1;
	for (int i=n;i>=1;--i) {
		for (int j=m;j>=1;--j) {
			if (sf[i][j]) {
				if (!c[i - 1][j]) sf[i - 1][j] = 1;
				if (!c[i][j - 1]) sf[i][j - 1] = 1;
			}		
		}
	}
	
	for (int i=1;i<=n;++i) {
		for (int j=1;j<=m;++j) {
			c[i][j] = (pf[i][j] && sf[i][j]);
			//cout << c[i][j] << " ";
		} //cout << '\n';
	}
	
	cin >> q;
	while (q--) {
		int x,y;
		cin >> x >> y;
		if (!c[x][y]) cout << 1;
		else if (only[x][y]) cout << 0;
		else {
			bool del = 0;
			for (int i=1;i<y;++i) if (c[x][i] && c[x + 1][i]) del = 1;
			for (int i=1;i<x;++i) if (c[i][y] && c[i][y + 1]) del = 1;
			//cout << ":" << del << '\n';
			
			if (del) {
				queue <pair <int, int>> q;
				q.emplace(x, y);
				c[x][y] = 0;
				
				//for (int i=1;i<=n;++i) {
				//	for (int j=1;j<=m;++j) cout << c[i][j] << ' '; cout << '\n';
				//}
				
				while (!q.empty()) {
					int u = q.front().first, v = q.front().second;
					q.pop();
					
					for (int t=0;t<4;++t) {
						int nx = u + dx[t];
						int ny = v + dy[t];
						if (!c[nx][ny]) continue;
						bool c1 = (c[nx - 1][ny] || c[nx][ny - 1]);
						bool c2 = (c[nx + 1][ny] || c[nx][ny + 1]);
						if ((!c1 && (nx != 1 || ny != 1)) || (!c2 && (nx != n || ny != m))) {
							//cout << nx << ' ' << ny << '\n';
							q.emplace(nx, ny);
							c[nx][ny] = 0;
						} 
					}
				}
				
				//for (int i=1;i<=n;++i) {
				//	for (int j=1;j<=m;++j) cout << c[i][j] << ' '; cout << '\n';
				//}
			}
			else only[x][y] = 1;
			
			if (del) cout << 1;
			else cout << 0;
		}
			
		cout << '\n';
	}	
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...