Submission #1232220

#TimeUsernameProblemLanguageResultExecution timeMemory
1232220alexander707070Toy (CEOI24_toy)C++20
100 / 100
443 ms287440 KiB
#include <bits/stdc++.h>
#define MAXN 1507
using namespace std;

int n,m,rows,cols;
int lx,ly,ux,uy;
int sx,sy,ex,ey;

char t[MAXN][MAXN];

int fromy[MAXN][MAXN],toy[MAXN][MAXN];
int fromx[MAXN][MAXN],tox[MAXN][MAXN];

int pr[MAXN][MAXN],nxt[MAXN][MAXN];
bool block[MAXN][MAXN];

vector<int> g[MAXN*MAXN];
bool vis[MAXN*MAXN];

void calc_states(){
    for(int i=1;i<=n;i++){
        int last=0;

        for(int f=1;f<=m;f++){
            if(t[i][f]=='X')last=f;
            pr[i][f]=last;
        }

        last=m+1;
        for(int f=m;f>=1;f--){
            if(t[i][f]=='X')last=f;
            nxt[i][f]=last;
        }

        for(int f=1;f<=m;f++){
            if(t[i][f]=='X')continue;

            if(nxt[i][f]-pr[i][f]-1<cols)block[i][f]=true;
            else{
                fromy[i][f]=max(pr[i][f]+1,f-cols+1);
                toy[i][f]=min(nxt[i][f]-cols,f);
            }
        }
    }

    for(int f=1;f<=m;f++){
        int last=0;

        for(int i=1;i<=n;i++){
            if(t[i][f]=='X')last=i;
            pr[i][f]=last;
        }

        last=n+1;
        for(int i=n;i>=1;i--){
            if(t[i][f]=='X')last=i;
            nxt[i][f]=last;
        }

        for(int i=1;i<=n;i++){
            if(t[i][f]=='X')continue;

            if(nxt[i][f]-pr[i][f]-1<rows)block[i][f]=true;
            else{
                fromx[i][f]=max(pr[i][f]+1,i-rows+1);
                tox[i][f]=min(nxt[i][f]-rows,i);
            }
        }
    }
}

bool ok(int a,int b,int c,int d){
    if(b<c or d<a)return false;
    return true;
}

void build_graph(){
    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            if(block[i][f])continue;

            if(!block[i][f+1] and ok(fromx[i][f],tox[i][f],fromx[i][f+1],tox[i][f+1])){
                g[i*m+f].push_back(i*m+f+1);
                g[i*m+f+1].push_back(i*m+f);

            }

            if(!block[i+1][f] and ok(fromy[i][f],toy[i][f],fromy[i+1][f],toy[i+1][f])){
                g[i*m+f].push_back((i+1)*m+f);
                g[(i+1)*m+f].push_back(i*m+f);
            }
        }
    }
}

bool dfs(int x,int y){
    if(x==y)return true;
    vis[x]=true;

    for(int i:g[x]){
        if(vis[i])continue;
        if(dfs(i,y))return true;
    }

    return false;
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>m>>n>>cols>>rows;
    cin>>lx>>ly>>ux>>uy;

    lx++; ly++; ux++; uy++;
    sx=ly; sy=ux;
    
    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            cin>>t[i][f];

            if(t[i][f]=='X')block[i][f]=true;

            if(t[i][f]=='*'){
                ex=i; ey=f;
            }
        }
    }

    calc_states();
    build_graph();

    if(dfs(sx*m+sy,ex*m+ey)){
        cout<<"YES\n";
    }else{
        cout<<"NO\n";
    }

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