제출 #1337647

#제출 시각아이디문제언어결과실행 시간메모리
1337647repmannFurniture (JOI20_furniture)C++20
5 / 100
5096 ms130436 KiB
#include <bits/stdc++.h>
using namespace std;
int N, M, Q;
bitset <1001> A[1001], CUT[1001];
int iter, VIS[1001][1001];
int IN[1002][1002];
int t, T[1001][1001], LOW[1001][1001];
vector <pair <int, int>> V;
int di[4] = {+1, +0, -1, +0};
int dj[4] = {+0, +1, +0, -1};
void DFSR(int i, int j)
{
  if((i < 1) || (j < 1) || A[i][j] || IN[i][j]) return;
//  cout << i << ' ' << j << '\n';
  for(int k = 2; k < 4; k++)
  {
    if(((i + di[k]) < 1) || ((j + dj[k]) < 1) || A[i + di[k]][j + dj[k]] || !IN[i + di[k]][j + dj[k]]) continue;
    IN[i + di[k]][j + dj[k]] *= bool(IN[i + di[k] + 1][j + dj[k]]) || bool(IN[i + di[k]][j + dj[k] + 1]);
    if(!IN[i + di[k]][j + dj[k]]) DFSR(i + di[k], j + dj[k]);
  }
  return;
}
bool DFS(int i, int j)
{
  VIS[i][j] = iter;
  if(CUT[i][j]) return 1;
  bool ret = 0;
  for(int k = 0; k < 2; k++)
  {
    if(((i + di[k]) > N) || ((j + dj[k]) > M) || A[i + di[k]][j + dj[k]]) continue;
    IN[i + di[k]][j + dj[k]]--;
    V.push_back({i + di[k], j + dj[k]});
    if(!IN[i + di[k]][j + dj[k]]) ret |= DFS(i + di[k], j + dj[k]);
  }
//  if(!ret) DFSR(i, j);
  return ret;
}
void DFSC(int i, int j, int ip = -1, int jp = -1)
{
  T[i][j] = LOW[i][j] = ++t;
  V.push_back({i, j});
//  cout << i << ' ' << j << ' ' << ip << ' ' << jp << '\n';
  for(int k = 0; k < 4; k++)
  {
    if(((i + di[k]) < 1) || ((i + di[k]) > N) || ((j + dj[k]) < 1) || ((j + dj[k]) > M) || (VIS[i + di[k]][j + dj[k]] != iter) || (((i + di[k]) == ip) && ((j + dj[k]) == jp))) continue;
    if(T[i + di[k]][j + dj[k]]) LOW[i][j] = min(T[i + di[k]][j + dj[k]], LOW[i][j]);
    else
    {
      DFSC(i + di[k], j + dj[k], i, j);
      LOW[i][j] = min(LOW[i + di[k]][j + dj[k]], LOW[i][j]);
//      CUT[i][j] = CUT[i][j] | (LOW[i + di[k]][j + dj[k]] >= T[i][j]);
    }
  }
  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[0][1] = IN[N + 1][M] = 1;
  for(int i = 1; i <= N; i++)
  {
    for(int j = 1; j <= M; j++) IN[i][j] = !A[i][j] * (bool(IN[i - 1][j]) + bool(IN[i][j - 1]));
  }
  for(int i = N; i >= 1; i--)
  {
    for(int j = M; j >= 1; j--) IN[i][j] *= bool(IN[i + 1][j]) || bool(IN[i][j + 1]);
  }
  CUT[N][M] = 1;
//  cout << "IN:\n";
//  for(int i = 1; i <= N; i++)
//  {
//    for(int j = 1; j <= M; j++) cout << IN[i][j] << " \n"[j == M];
//  }
  cin >> Q;
  int r, c;
  while(Q--)
  {
    cin >> r >> c;
    iter++;
    if(!CUT[r][c] && (!IN[r][c] || !DFS(r, c)))
    {
      cout << "1\n";
      IN[r][c] = 0;
      DFSR(r, c);
      V.clear();
//      cout << "IN:\n";
//      for(int i = 1; i <= N; i++)
//      {
//        for(int j = 1; j <= M; j++) cout << IN[i][j] << " \n"[j == M];
//      }
    }
    else
    {
      cout << "0\n";
      if(!V.size()) continue;
      CUT[r][c] = 1;
      for(pair <int, int> p : V) IN[p.first][p.second]++;
      V.clear();
      t = 0;
      DFSC(r, c);
      for(pair <int, int> p : V) T[p.first][p.second] = LOW[p.first][p.second] = 0;
      V.clear();
//      cout << "CUT:\n";
//      for(int i = 1; i <= N; i++)
//      {
//        for(int j = 1; j <= M; j++) cout << CUT[i][j] << " \n"[j == M];
//      }
    }
  }

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