Submission #1198806

#TimeUsernameProblemLanguageResultExecution timeMemory
1198806Marco_EscandonFurniture (JOI20_furniture)C++20
0 / 100
3 ms832 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
vector<vector<ll>> cad,cad2;
ll dfs(ll x, ll y)
{
    if(x==n-1&&y==m-1) return 0;
    if(x==n||y==m||cad[x][y]==1) return 1;
    if(cad2[x][y]!=-1) return cad2[x][y];
    return cad2[x][y]=min(dfs(x+1,y),dfs(x,y+1));
}
int main()
{
    cin>>n>>m;
    cad.assign(n,vector<ll>(m, 0));
    cad2.assign(n,vector<ll>(m, -1));
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin>>cad[i][j];
    dfs(0,0);
    vector<set<pair<ll,ll>>> s(n+m+5);
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            if(cad2[i][j]==0) s[i+j].insert({i,j});
            if(cad2[i][j]==-1) cad2[i][j]=1;
        }
            
    ll q;
    cin>>q;
    while(q--)
    {
        ll a,b;
        cin>>a>>b;
        a--; b--;
        if(s[a+b].size()-(s[a+b].find({a,b})!=s[a+b].end())>=1)
        {
            cout<<"1\n";
            if(s[a+b].find({a,b})!=s[a+b].end())
            s[a+b].erase({a,b});
            cad2[a][b]=1;
            for(int i=a; i<n; i++)
            {
                ll c=0;
                for(int j=b; j<m; j++)
                {
                    if(a==i&&b==j) continue;
                    if(cad2[i][j]) break;
                    ll o1=1;if(i>0) o1=cad[i-1][j];
                    ll o2=1;if(j>0) o2=cad[i][j-1];
                    cad2[i][j]=min(o1,o2);
                    if(!cad2[i][j]) break;
                    c++;
                    if(s[i+j].find({i,j})!=s[i+j].end())
                    s[i+j].erase({i,j});
                }
                if(c==0) break;
            }
            for(int i=a; i>-1; i--)
            {
                ll c=0;
                for(int j=b; j>-1; j--)
                {
                    if(a==i&&b==j) continue;
                    if(cad2[i][j]) break;
                    ll o1=1;if(i<n-1) o1=cad[i+1][j];
                    ll o2=1;if(j<m-1) o2=cad[i][j+1];
                    cad2[i][j]=min(o1,o2);
                    if(!cad2[i][j]) break;
                    c++;
                    if(s[i+j].find({i,j})!=s[i+j].end())
                    s[i+j].erase({i,j});
                }
                if(c==0) break;
            }
        }
        else cout<<"0\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...