Submission #1193461

#TimeUsernameProblemLanguageResultExecution timeMemory
1193461UnforgettableplToy (CEOI24_toy)C++20
100 / 100
307 ms459032 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int W,H,K,L;
    cin >> W >> H >> K >> L;
    int xSt,ySt;
    {
        int t;
        cin >> t >> xSt >> ySt >> t;
        xSt++;
        ySt++;
    }
    vector visited(H+2,vector<bool>(W+2));
    for(int i=0;i<=H+1;i++)visited[i][0]=visited[i][W+1]=true;
    for(int i=0;i<=W+1;i++)visited[0][i]=visited[H+1][i]=true;
    int xEd,yEd;
    
    vector<vector<int>> verticals(W+1);
    for(int i=1;i<=W;i++)verticals[i].emplace_back(0);
    for(int i=1;i<=W;i++)verticals[i].emplace_back(H+1);
    
    vector<vector<int>> horizontals(H+1);
    for(int i=1;i<=H;i++)horizontals[i].emplace_back(0);
    for(int i=1;i<=H;i++)horizontals[i].emplace_back(W+1);
    
    for(int i=1;i<=H;i++){
        for(int j=1;j<=W;j++){
            char x;cin>>x;
            if(x=='X'){
                visited[i][j]=true;
                verticals[j].emplace_back(i);
                horizontals[i].emplace_back(j);
            }
            if(x=='*'){
                xEd = i;
                yEd = j;
            }
        }
    }

    for(int i=1;i<=W;i++)sort(verticals[i].begin(),verticals[i].end());
    for(int i=1;i<=H;i++)sort(horizontals[i].begin(),horizontals[i].end());

    auto getVerticalRange = [&](int y,int x){
        auto iter = lower_bound(verticals[x].begin(),verticals[x].end(),y);
        assert(iter!=verticals[x].end());
        assert(iter!=verticals[x].begin()); 
        auto bef = iter-1;
        return make_pair(*bef,*iter);
    };

    auto getHorizonalRange = [&](int x,int y){
        auto iter = lower_bound(horizontals[x].begin(),horizontals[x].end(),y);
        assert(iter!=horizontals[x].end());
        assert(iter!=horizontals[x].begin());
        auto bef = iter-1;
        return make_pair(*bef,*iter);
    };

    function<void(int,int)> dfs = [&](int x,int y){
        visited[x][y]=true;
        auto myHori = getHorizonalRange(x,y);
        auto myVeri = getVerticalRange(x,y);
        if(!visited[x-1][y]){
            auto t = getHorizonalRange(x-1,y);
            t.first=max(t.first,myHori.first);
            t.second=min(t.second,myHori.second);
            int r = t.second-t.first-1;
            if(r>=K)dfs(x-1,y);
        }
        if(!visited[x+1][y]){
            auto t = getHorizonalRange(x+1,y);
            t.first=max(t.first,myHori.first);
            t.second=min(t.second,myHori.second);
            int r = t.second-t.first-1;
            if(r>=K)dfs(x+1,y);
        }
        if(!visited[x][y-1]){
            auto t = getVerticalRange(x,y-1);
            t.first=max(t.first,myVeri.first);
            t.second=min(t.second,myVeri.second);
            int r = t.second-t.first-1;
            if(r>=L)dfs(x,y-1);
        }
        if(!visited[x][y+1]){
            auto t = getVerticalRange(x,y+1);
            t.first=max(t.first,myVeri.first);
            t.second=min(t.second,myVeri.second);
            int r = t.second-t.first-1;
            if(r>=L)dfs(x,y+1);
        }
    };

    dfs(xSt,ySt);
    if(visited[xEd][yEd]){
        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...