제출 #1154135

#제출 시각아이디문제언어결과실행 시간메모리
1154135brover29Furniture (JOI20_furniture)C++20
5 / 100
5092 ms16088 KiB
#include <bits/stdc++.h>
//qwerty47924692
using namespace std;
using ll = long long;
const ll N=1005;
const string br="617283";
#define sz(a)(ll)a.size()
#define f first
#define s second
ll n,m,a[N][N],mnr[N][N],mxr[N][N],mxc[N][N],mnc[N][N],sz[N][N],dp[N][N];
pair<ll,ll>pr[N][N];
ll dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
pair<ll,ll> get(pair<ll,ll> a){
    ll x,y;
    x=a.f;
    y=a.s;
    return (pr[x][y]==make_pair(x,y) ? make_pair(x,y) : pr[x][y]=get(pr[x][y]));
}
void uni(pair<ll,ll>u,pair<ll,ll>v){
    u=get(u);
    v=get(v);
    if(u==v)return;
    if(sz[u.f][u.s]>sz[v.f][v.s])swap(v,u);
    pr[u.f][u.s]=v;
    sz[v.f][v.s]+=sz[u.f][u.s];
    mxc[v.f][v.s]=max(mxc[v.f][v.s],mxc[u.f][u.s]);
    mnc[v.f][v.s]=min(mnc[v.f][v.s],mnc[u.f][u.s]);
    mxr[v.f][v.s]=max(mxr[v.f][v.s],mxr[u.f][u.s]);
    mnr[v.f][v.s]=min(mnr[v.f][v.s],mnr[u.f][u.s]);
}
bool try_uni(ll x,ll y){
    ll maxr=x;
    ll minr=x;
    ll maxc=y;
    ll minc=y;
    for(ll i=0;i<4;i++){
        for(ll j=0;j<4;j++){
            if(dx[i]==0&&dy[j]==0)continue;

            if(!a[x+dx[i]][y+dy[j]])continue;

            pair<ll,ll> nw={x+dx[i],y+dy[j]};
            nw=get(nw);
         //   cout<<mx[2][1]<<'\n';
            maxr=max(maxr,mxr[nw.f][nw.s]);
            minr=min(minr,mnr[nw.f][nw.s]);
            maxc=max(maxc,mxc[nw.f][nw.s]);
            minc=min(minc,mnc[nw.f][nw.s]);
        }
    }
    if((maxr==n&&minr==1)||(maxc==m&&minc==1)||(maxc==m&&maxr==n)||(minc==1&&minr==1)){
        return 0;
    }

    for(ll i=0;i<4;i++){
        for(ll j=0;j<4;j++){
            if(dx[i]==0&&dy[j]==0)continue;
            if(!a[x+dx[i]][y+dy[j]])continue;
            pair<ll,ll> nw={x+dx[i],y+dy[j]};
            nw=get(nw);
            if(nw==get({x,y}))continue;
            uni(nw,get({x,y}));
        }
    }
    a[x][y]=1;
    return 1;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>m;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            cin>>a[i][j];
            a[i][j]^=1;


        }
    }


    ll q;
    cin>>q;
    while(q--){
        ll x,y;
        cin>>x>>y;
        a[x][y]=0   ;
        dp[1][1]=1;
        for(ll i=1;i<=n;i++){
            for(ll j=1;j<=m;j++){
               // cout<<a[i][j]<<' ';
                if(i==1&&j==1)continue;
                dp[i][j]=0;
                if(a[i][j]==0)continue;
                dp[i][j]=(dp[i][j-1]|dp[i-1][j]);
            }
           // cout<<'\n';
        }
        if(!dp[n][m])a[x][y]=1;
        cout<<dp[n][m]<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...