Submission #810475

#TimeUsernameProblemLanguageResultExecution timeMemory
810475asdasdqwerMecho (IOI09_mecho)C++17
100 / 100
530 ms17004 KiB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t
#define mp make_pair
#define pii pair<int, int>
#define f first
#define s second
#define tii array<int, 3>
#define all(x) x.begin(), x.end()
#define pb push_back
#define ppi pair<pii, int>

vector<pii> dir = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

pii operator+(const pii &x, const pii &y) {
    return mp(x.f+y.f, x.s+y.s);
}

bool check(const pii &x, int n) {
    return x.f >= 0 && x.f < n && x.s >= 0 && x.s < n;
}

// void printArr(vector<vector<int>> &a) {
//     int n = a.size();
//     for (int i=0;i<n;i++) {
//         fmt::print("{}\n", a[i]);
//     }
// }

bool test(int wait, vector<vector<int>> &grid, int st, pii &pos, pii &des) {
    // simulate "wait"
    int n=grid.size();
    vector<vector<int>> status(n, vector<int>(n, 0));
    queue<pair<pii, int>> q;
    vector<pii> hv;
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) {
            if (grid[i][j]==0) {
                hv.pb(mp(i, j));
            }
        }
    }

    for (auto &x:hv) {
        q.push(mp(x, 0));
        status[x.f][x.s]=1;
    }

    while (!q.empty() && q.front().s != wait) {
        ppi t = q.front();q.pop();
        if (t.s != wait) {
            for (int i=0;i<4;i++) {
                pii add = t.f + dir[i];
                if (check(add, n) && status[add.f][add.s] != 1 && grid[add.f][add.s]==1) {
                    status[add.f][add.s]=1;
                    q.push(mp(add, t.s+1));
                }
            }
        }
    }

    queue<ppi> pq;
    pq.push(mp(pos, 0));
    int endB = wait;
    int endP = 0;
    while (true) {
        endB++;endP+=st;
        if (pq.empty()) return false;
        while (!pq.empty() && pq.front().s != endP) {
            ppi t=pq.front();pq.pop();
            if (t.f==des) {
                return true;
            }

            if (status[t.f.f][t.f.s]==1) {
                continue;
            }

            for (int i=0;i<4;i++) {
                pii add=t.f + dir[i];
                if (check(add, n) && (status[add.f][add.s]==0) && grid[add.f][add.s]==1) {
                    status[add.f][add.s]=2;
                    pq.push(mp(add, t.s+1));
                }

                else if (check(add, n) && add==des) {
                    return true;
                } 
            }
        }

        while (!q.empty() && q.front().s != endB) {
            ppi t = q.front();q.pop();
            if (t.s != endB) {
                for (int i=0;i<4;i++) {
                    pii add = t.f + dir[i];
                    if (check(add, n) && status[add.f][add.s] != 1 && grid[add.f][add.s]==1) {
                        status[add.f][add.s]=1;
                        q.push(mp(add, t.s+1));
                    }
                }
            }
        }
    }
}

int binSearch(vector<vector<int>> a, int st, pii &pos, pii &des) {
    int n = a.size();
    int l = 0, r = 2*(n*n);

    int ans = -1;
    while (l <= r) {
        int m = l + (r-l)/2;
        bool t = test(m, a, st, pos, des);
        // cout << m << " " << t << "\n";
        if (t) {
            l = m+1;
            ans = m;
        }

        else {
            r = m-1;
        }
    }

    return ans;
}

signed main() {
    // freopen("in.txt", "r", stdin);
    int n, st;cin>>n>>st;
    vector<vector<int>> a(n, vector<int>(n, 0));
    pii pos, des;
    for (int i=0;i<n;i++) {
        string s;cin>>s;
        for (int j=0;j<n;j++) {
            if (s[j]=='H')a[i][j]=0;
            if (s[j]=='G')a[i][j]=1;
            if (s[j]=='M') {
                a[i][j]=1;
                pos=mp(i, j);
            }

            if (s[j]=='D') {
                a[i][j]=-1;
                des=mp(i, j);
            }

            if (s[j]=='T')a[i][j]=-1;
        }
    }
    // cout << test(0, a, st, pos, des) << "\n";
    cout << binSearch(a, st, pos, des) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...