Submission #1092787

#TimeUsernameProblemLanguageResultExecution timeMemory
109278712345678Furniture (JOI20_furniture)C++17
100 / 100
228 ms31568 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e3+5;

int n, m, q, x, y, c[nx][nx], vs[nx][nx], vsrv[nx][nx], in[nx][nx], out[nx][nx], layer[2*nx];

bool calc(int i, int j)
{
    if (!vs[i][j]) return 0;
    in[i][j]=out[i][j]=0;
    if (i!=1&&vs[i-1][j]) in[i][j]++;
    if (j!=1&&vs[i][j-1]) in[i][j]++;
    if (i!=n&&vs[i+1][j]) out[i][j]++;
    if (j!=m&&vs[i][j+1]) out[i][j]++;
    if ((i==1&&j==1)||(i==n&&j==m)) return 0;
    return min(in[i][j], out[i][j])==0;
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) cin>>c[i][j];
    vs[1][1]=1;
    vsrv[n][m]=1;
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (!(i==1&&j==1)&&!c[i][j]) vs[i][j]=vs[i-1][j]||vs[i][j-1];
    for (int i=n; i>=1; i--) for (int j=m; j>=1; j--) if (!(i==n&&j==m)&&!c[i][j]) vsrv[i][j]=vsrv[i+1][j]||vsrv[i][j+1];
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) vs[i][j]=vs[i][j]&&vsrv[i][j];
    for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (vs[i][j]) layer[i+j]++, calc(i, j);
    cin>>q;
    while (q--)
    {
        cin>>x>>y;
        if (!vs[x][y]) cout<<1<<'\n';
        else
        {
            if (layer[x+y]==1) cout<<0<<'\n';
            else
            {
                cout<<1<<'\n';
                queue<pair<int, int>> q;
                vs[x][y]=0;
                layer[x+y]--;
                q.push({x, y});
                while (!q.empty())
                {
                    auto [a, b]=q.front();
                    q.pop();
                    if (a!=1&&calc(a-1, b)) vs[a-1][b]=0, layer[a-1+b]--, q.push({a-1, b});
                    if (b!=1&&calc(a, b-1)) vs[a][b-1]=0, layer[a+b-1]--, q.push({a, b-1});
                    if (a!=n&&calc(a+1, b)) vs[a+1][b]=0, layer[a+1+b]--, q.push({a+1, b});
                    if (b!=m&&calc(a, b+1)) vs[a][b+1]=0, layer[a+b+1]--, q.push({a, b+1});
                }
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...