Submission #1289103

#TimeUsernameProblemLanguageResultExecution timeMemory
1289103wedonttalkanymoreFurniture (JOI20_furniture)C++20
100 / 100
258 ms34024 KiB
#include <bits/stdc++.h>
/*
    Ngay hay dem
    Voi troi giac mo em dem
*/
using namespace std;
using ll = long long;

#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll N = 1e3 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19;

int n, m, a[N][N];
int q;
int can[N][N][2];
int dx[] = {0, 1, -1, 0}; // phai, duoi, tren, trai
int dy[] = {1, 0, 0, -1};
int pre[N][N];

void bfs(int st1, int st2, int type) {
	can[st1][st2][type] = 1;
	queue <pii> q;
	q.push({st1, st2});
//	cout << "st: " << st1 << ' ' << st2 << '\n';
	while(q.size()) {
		auto [x, y] = q.front();
		q.pop();
//		cout << x << ' ' << y << '\n';
//		cout << type * 2 << '\n';
		for (int i = type * 2; i < type * 2 + 2; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
//			cout << "gg: " << nx << ' ' << ny << '\n';
			if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
			if (a[nx][ny] || can[nx][ny][type]) continue;
			can[nx][ny][type] = 1;
			q.push({nx, ny});
		}
	}
}

int cnt[2 * N];

int dead(int i, int j) {
	if (i < 1 || j < 1 || i > n || j > m) return 0; // 1 la ko dead
	return pre[i][j]; // = 0 la dead, = 1 la ko dead
}

void bfs1(int st1, int st2) {
	queue <pii> q;
	q.push({st1, st2});
	while(q.size()) {
		auto [x, y] = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (nx < 1 || ny < 1 || nx > n || ny > m) continue;
			if (pre[nx][ny] == 0) continue;
			if ((nx == 1 && ny == 1) || (nx == n && ny == m)) continue;
			if (!dead(nx + 1, ny) && !dead(nx, ny + 1)) {
				q.push({nx, ny});
				cnt[nx + ny]--;
				pre[nx][ny] = 0;
				continue;
			}

			if (!dead(nx - 1, ny) && !dead(nx, ny - 1)) {
				q.push({nx, ny});
				cnt[nx + ny]--;
				pre[nx][ny] = 0;
				continue;
			}
		}
	}
}

signed main() {
     ios::sync_with_stdio(false);
     cin.tie(0);
    if (fopen(".inp", "r")) {
        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 >> a[i][j];
		}
	}
	bfs(1, 1, 0);
	bfs(n, m, 1);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
//			cout << i << ' ' << j << ' ' << can[i][j][0] << ' ' << can[i][j][1] << '\n';
			if (can[i][j][0] && can[i][j][1]) {
				pre[i][j] = 1; // 1 la co nice di qua
				cnt[i + j]++;
//				cout << "at: " << i << ' ' << j << '\n';
			}
		}
	}
	cin >> q;
	for (int i = 1; i <= q; i++) {
		int x, y;
		cin >> x >> y;
		if (pre[x][y] == 0) {
			cout << 1 << '\n';
		}
		else {
			if (cnt[x + y] > 1) {
				cnt[x + y]--;
				pre[x][y] = 0;
				bfs1(x, y);
				cout << 1 << '\n';
			}
			else cout << 0 << '\n';
		}
	}
    return 0;
}

Compilation message (stderr)

furniture.cpp: In function 'int main()':
furniture.cpp:85:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
furniture.cpp:86:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...