제출 #1338042

#제출 시각아이디문제언어결과실행 시간메모리
1338042repmannFurniture (JOI20_furniture)C++20
100 / 100
159 ms10320 KiB
#include <bits/stdc++.h>
using namespace std;
int N, M, Q;
bitset <1001> A[1001];
int CNT[2001], IN[1001][1001], OUT[1001][1001];
int di[4] = {+1, +0, -1, +0};
int dj[4] = {+0, +1, +0, -1};
void Print()
{
  cout << "A:\n";
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++) cout << A[i][j] << " \n"[j == M];
  }
  cout << "IN:\n";
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++) cout << IN[i][j] << " \n"[j == M];
  }
  cout << "OUT:\n";
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++) cout << OUT[i][j] << " \n"[j == M];
  }
  for(int i = 2; i <= (N + M); i++) cout << CNT[i] << " \n"[i == (N + M)];
  return;
}
void BFS(int i, int j)
{
  if(A[i][j]) return;
  queue <int> QI, QJ;
  QI.push(i);
  QJ.push(j);
  while(QI.size())
  {
    i = QI.front();
    j = QJ.front();
    CNT[i + j]--;
    if(!CNT[i + j]) exit(333);
    A[i][j] = 1;
    IN[i][j] = OUT[i][j] = 0;
    QI.pop();
    QJ.pop();
    for(int k = 0; k < 2; k++)
    {
      if(((i + di[k]) > N) || ((j + dj[k]) > M) || A[i + di[k]][j + dj[k]] || !IN[i + di[k]][j + dj[k]]) continue;
      IN[i + di[k]][j + dj[k]]--;
      if(!IN[i + di[k]][j + dj[k]]) {QI.push(i + di[k]); QJ.push(j + dj[k]);}
    }
    for(int k = 2; k < 4; k++)
    {
      if(((i + di[k]) < 1) || ((j + dj[k]) < 1) || A[i + di[k]][j + dj[k]] || !OUT[i + di[k]][j + dj[k]]) continue;
      OUT[i + di[k]][j + dj[k]]--;
      if(!OUT[i + di[k]][j + dj[k]]) {QI.push(i + di[k]); QJ.push(j + dj[k]);}
    }
  }
  return;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N >> M;
  int x;
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++) {cin >> x; A[i][j] = x;}
  }
  IN[1][1] = 1;
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++)
    {
      if(A[i][j]) continue;
      IN[i][j] += bool(IN[i - 1][j]) + bool(IN[i][j - 1]);
    }
  }
  OUT[N][M] = 1;
  for(int i = N; i >= 1; i--)
  {
    for(int j = M; j >= 1; j--)
    {
      if(A[i][j] || !IN[i][j]) continue;
      if(i < N) OUT[i][j] += bool(OUT[i + 1][j]);
      if(j < M) OUT[i][j] += bool(OUT[i][j + 1]);
      if(!OUT[i][j]) IN[i][j] = 0;
    }
  }
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++)
    {
      A[i][j] = A[i][j] || !IN[i][j] || !OUT[i][j];
      CNT[i + j] += !A[i][j];
    }
  }
  cin >> Q;
  int r, c;
  while(Q--)
  {
    cin >> r >> c;
    if(!A[r][c] && (CNT[r + c] == 1)) cout << "0\n";
    else {cout << "1\n"; BFS(r, c);}
//    Print();
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...