Submission #1293013

#TimeUsernameProblemLanguageResultExecution timeMemory
1293013dostsToy (CEOI24_toy)C++20
0 / 100
9 ms7692 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;

const int N = 1e5+1;

void solve() {
    int n,m,a,b;
    cin >> m >> n >> b >> a;
    string grid[n+1];
    int sx,sy,tx=-1,ty=-1;
    int cx,cy,dx,dy;
    cin >> dy >> dx >> cy >> cx ;
    for (int j = 0;j<b;j++) {
        for (int jj = 0;jj<a;jj++) {
            if (pii{cx+jj,cy} == pii{dx,dy+j}) {
                sx = cx+jj,sy = cy;
            }
        }
    }
    for (int i=1;i<=n;i++) {
        cin >> grid[i];
        for (int j = 0;j<m;j++) {
            if (grid[i][j] == '*') {
                tx = i,ty = j+1;
            }
        }
    }
    sx++,sy++;
    cerr << sx sp sy sp tx sp ty << endl;
    auto get = [&](vector<vi>& pr,int x1,int y1,int x2,int y2) {
        return pr[x2][y2]-pr[x1-1][y2]-pr[x2][y1-1]+pr[x1-1][y1-1];
    };

    vector<vi> pref(n+1,vi(m+1,0));
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            pref[i][j] = pref[i-1][j]+pref[i][j-1]-pref[i-1][j-1]+(grid[i][j-1]=='X');
        }
    }
    vector<vi> sftle(n+1,vi(m+1,0)),sftri(n+1,vi(m+1,0)),sftdn(n+1,vi(m+1,0)),sftup(n+1,vi(m+1,0));
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            if (i < a || j == 1) continue;
            sftle[i][j] = !get(pref,i-a+1,j-1,i,j);
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            if (i < a || j == m) continue;
            sftri[i][j] = !get(pref,i-a+1,j,i,j+1);
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            if (i == n || j < b) continue;
            sftdn[i][j] = !get(pref,i,j-b+1,i+1,j);
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            if (i == 1 || j < b) continue;
            sftup[i][j] = !get(pref,i-1,j-b+1,i,j);
        }
    }
    
    for (int i=1;i<=n;i++) {
        for (int j = 1;j<=m;j++) {
            sftle[i][j] = sftle[i-1][j]+sftle[i][j-1]-sftle[i-1][j-1]+(sftle[i][j]);
            sftri[i][j] = sftri[i-1][j]+sftri[i][j-1]-sftri[i-1][j-1]+(sftri[i][j]);
            sftdn[i][j] = sftdn[i-1][j]+sftdn[i][j-1]-sftdn[i-1][j-1]+(sftdn[i][j]);
            sftup[i][j] = sftup[i-1][j]+sftup[i][j-1]-sftup[i-1][j-1]+(sftup[i][j]);
        }
    }
    
    vector<vi> dist(n+1,vi(m+1,inf));
    int yuk[n+1][m+1],asa[n+1][m+1],sa[n+1][m+1],so[n+1][m+1];
    int lst = 0;
    for (int i=1;i<=n;i++){
        lst = 0;
        for (int j = 1;j<=m;j++) {
            if (grid[i][j-1] == 'X') {
                lst = j;
                continue;
            }
            so[i][j] = lst;
        }
        lst = m+1;
        for (int j = m;j>=1;j--) {
            if (grid[i][j-1] == 'X') {
                lst = j;
                continue;
            }
            sa[i][j] = lst;
        }
    }
    for (int j=1;j<=m;j++) {
        lst = 0;
        for (int i=1;i<=n;i++) {
            if (grid[i][j-1] == 'X') {
                lst = i;
                continue;
            }
            yuk[i][j] = lst;
        }
        lst = n+1;
        for (int i = n;i>=1;i--) {
            if (grid[i][j-1] == 'X') {
                lst = i;
                continue;
            }
            asa[i][j] = lst;
        }
    }
    dist[sx][sy] = 0;   
    queue<pii> q;
    q.push({sx,sy});
    
    auto cool = [&](int x,int y) -> bool {
        return (x >= 1 && x <= n && y >= 1 && y <= m) && dist[x][y] == inf && grid[x][y-1]!='X';
    };

    while (!q.empty()) {
        pii f = q.front();
        q.pop();
        int x = f.ff,y = f.ss;
        int upp = max(x-a+1,yuk[x][y]+1);
        int dwn = min(x+a-1,asa[x][y]-1);
        int sag = min(y+b-1,sa[x][y]-1);
        int sol = max(y-b+1,so[x][y]+1);
        if (cool(x,y-1) && get(sftle,upp,y,dwn,y)) {
            dist[x][y-1] = dist[x][y]+1;
            q.push({x,y-1});
        }
        if (cool(x,y+1) && get(sftri,upp,y,dwn,y)) {
            dist[x][y+1] = dist[x][y]+1;
            q.push({x,y+1});
        }
        if (cool(x-1,y) && get(sftup,x,sol,x,sag)) {
            dist[x-1][y] = dist[x][y]+1;
            q.push({x-1,y});
        }       
        if (cool(x+1,y) && get(sftdn,x,sol,x,sag)) {
            dist[x+1][y] = dist[x][y]+1;
            q.push({x+1,y});
        }
    }
    if (dist[tx][ty] == inf) cout << "NO\n";
    else cout << "YES\n"; 
} 

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#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...