Submission #1091349

#TimeUsernameProblemLanguageResultExecution timeMemory
1091349conthoancoMecho (IOI09_mecho)C++14
95 / 100
127 ms7028 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;

const int N = 805;

const int dx[4] = {0, 0, -1, 1};
const int dy[4] = {-1, 1, 0, 0};

int n, s;
char c[N][N];
pair<int, int> hive, house, bear;
int mecho[N][N], bee[N][N];

bool check(int time)
{
    memset(mecho, -1, sizeof(mecho));
    mecho[bear.fi][bear.se] = 0;
    if(bee[bear.fi][bear.se] <= time) return false;
    queue<pair<int, int>> p;
    p.push(bear);

    while(p.size())
    {
        int u = p.front().fi;
        int v = p.front().se;
        p.pop();
        for(int e = 0; e < 4; e ++)
        {
            int nu = u + dx[e];
            int nv = v + dy[e];
            if(nu < 1 || nu > n) continue;
            if(nv < 1 || nv > n) continue;
            if(mecho[nu][nv] == -1 && c[nu][nv] != 'T')
            {
                if((mecho[u][v] + 1)/s + time < bee[nu][nv])
                {
                    mecho[nu][nv] = mecho[u][v] + 1;
                    p.push({nu, nv});
                }
            }
        }
    }

    for(int e = 0; e < 4; e ++)
    {
        if(house.fi + dx[e] < 1 || house.fi + dx[e] > n) continue;
        if(house.se + dy[e] < 1 || house.se + dy[e] > n) continue;
        if(c[house.fi + dx[e]][house.se + dy[e]] == 'T') continue;
        if(c[house.fi + dx[e]][house.se + dy[e]] == 'H') continue;
        if(mecho[house.fi + dx[e]][house.se + dy[e]] != -1) return true;
    }

    return false;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> s;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
        {
            cin >> c[i][j];
            if(c[i][j] == 'M')
                bear = {i, j};
            if(c[i][j] == 'D')
                house = {i, j};
        }
    memset(bee, -1, sizeof(bee));

    queue<pair<int, int>> q;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++){
            if(c[i][j] == 'H')
            {
                bee[i][j] = 0;
                q.push({i, j});
            }

        }
    while(q.size())
    {
        int u = q.front().fi;
        int v = q.front().se;
        q.pop();
        for(int e = 0; e < 4; e ++)
        {
            int nu = u + dx[e];
            int nv = v + dy[e];
            if(nu < 1 || nu > n) continue;
            if(nv < 1 || nv > n) continue;
            if(bee[nu][nv] == -1 && c[nu][nv] != 'T')
            {
                bee[nu][nv] = bee[u][v] + 1;
                q.push({nu, nv});
            }
        }
    }

    int l = 0, r = 1e9, ans = -1;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        if(check(mid))
        {
            ans = mid;
            l = mid + 1;
        }
        else
            r = mid - 1;
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...