Submission #1231880

#TimeUsernameProblemLanguageResultExecution timeMemory
1231880PVM_pvmToy (CEOI24_toy)C++20
100 / 100
290 ms216344 KiB
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1507
int ww,h,k,l;
int xh,yh,xv,yv;
int xg,yg;
int xs,ys;
bool bl[MAXN][MAXN];
int lf[MAXN][MAXN],rt[MAXN][MAXN];
int up[MAXN][MAXN],dw[MAXN][MAXN];
bool b[MAXN][MAXN];
pair<int,int> dl[4]={ {1,0} , {-1,0} , {0,-1} , {0,1} };
void dfs(int x, int y)
{
    b[x][y]=1;
    for (int dd=0;dd<4;dd++)
    {
        int nx=x+dl[dd].first;
        int ny=y+dl[dd].second;
        if (nx<0 || nx>=h) continue;
        if (ny<0 || ny>=ww) continue;
        if (bl[nx][ny]) continue;
        if (b[nx][ny]) continue;
        int dlred=rt[nx][ny]-lf[nx][ny]+1;
        if (dlred<k) continue;
        int dlkol=dw[nx][ny]-up[nx][ny]+1;
        if (dlkol<l) continue;
        int ort=min(rt[nx][ny],rt[x][y]);
        int olf=max(lf[nx][ny],lf[x][y]);
        int oup=max(up[nx][ny],up[x][y]);
        int odw=min(dw[nx][ny],dw[x][y]);
        int odlkol=odw-oup+1;
        int odlred=ort-olf+1;
        if (odlred<k) continue;
        if (odlkol<l) continue;
        dfs(nx,ny);
    }
}
int main()
{
    cin>>ww>>h>>k>>l;
    cin>>xh>>yh>>xv>>yv;
    for (int q=0;q<h;q++)
    {
        string s;
        cin>>s;
        for (int w=0;w<ww;w++)
        {
            if (s[w]=='X') bl[q][w]=1;
            else
            {
                bl[q][w]=0;
                if (s[w]=='*')
                {
                    xg=w;
                    yg=q;
                }
            }
        }
    }
    xs=xv;
    ys=yh;
    for (int q=0;q<h;q++)
    {
        if (bl[q][0]) lf[q][0]=0;
        else lf[q][0]=-1;
        for (int w=1;w<ww;w++)
        {
            if (bl[q][w]) lf[q][w]=w;
            else lf[q][w]=lf[q][w-1];
        }
        if (bl[q][ww-1]) rt[q][ww-1]=ww-1;
        else rt[q][ww-1]=ww;
        for (int w=ww-2;w>=0;w--)
        {
            if (bl[q][w]) rt[q][w]=w;
            else rt[q][w]=rt[q][w+1];
        }
    }
    for (int w=0;w<ww;w++)
    {
        if (bl[0][w]) up[0][w]=0;
        else up[0][w]=-1;
        for (int q=1;q<h;q++)
        {
            if (bl[q][w]) up[q][w]=q;
            else up[q][w]=up[q-1][w];
        }
        if (bl[h-1][w]) dw[h-1][w]=h-1;
        else dw[h-1][w]=h;
        for (int q=h-2;q>=0;q--)
        {
            if (bl[q][w]) dw[q][w]=q;
            else dw[q][w]=dw[q+1][w];
        }
    }
    for (int q=0;q<h;q++)
    {
        for (int w=0;w<ww;w++)
        {
            lf[q][w]++;
            rt[q][w]--;
            up[q][w]++;
            dw[q][w]--;
        }
    }
    dfs(ys,xs);
    if (b[yg][xg])
    {
        cout<<"YES\n";
    }
    else cout<<"NO\n";
}
#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...