Submission #1176450

#TimeUsernameProblemLanguageResultExecution timeMemory
1176450irmuunMecho (IOI09_mecho)C++20
100 / 100
181 ms31280 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,s;
    cin>>n>>s;
    auto a=vector(n,vector<char>(n));
    int mi,mj,di,dj;
    vector<pair<int,int>>h;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
            if(a[i][j]=='D'){
                di=i,dj=j;
            }
            if(a[i][j]=='M'){
                mi=i,mj=j;
            }
            if(a[i][j]=='H'){
                h.pb({i,j});
            }
        }
    }
    vector<int>dx={0,0,-1,1};
    vector<int>dy={-1,1,0,0};
    auto bee=vector(n,vector<int>(n,1e9));
    queue<pair<int,int>>q;
    for(auto [i,j]:h){
        bee[i][j]=0;
        q.push({i,j});
    }
    vector<pair<int,int>>g[n*n];
    while(!q.empty()){
        int i=q.front().ff,j=q.front().ss;
        int d=bee[i][j];
        q.pop();
        for(int k=0;k<4;k++){
            int ni=i+dx[k],nj=j+dy[k];
            if(ni<0||nj<0||ni>=n||nj>=n) continue;
            if(a[ni][nj]=='T'||a[ni][nj]=='D') continue;
            if(bee[i][j]+1<bee[ni][nj]){
                bee[ni][nj]=bee[i][j]+1;
                q.push({ni,nj});
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(bee[i][j]<1e9){
                g[bee[i][j]].pb({i,j});
            }
        }
    }
    int lo=-1,hi=n*n;
    vector<bool>used(n*n,false);
    while(lo<hi){
        int mid=(lo+hi+1)/2;
        auto dist=vector(n,vector<int>(n,1e9));
        queue<pair<int,int>>q;
        q.push({mi,mj});
        dist[mi][mj]=mid;
        int cur=0;
        bool ok=false;
        fill(all(used),false);
        while(!q.empty()){
            int i=q.front().ff,j=q.front().ss;
            int d=dist[i][j];
            if((d-mid)/s+mid>=bee[i][j]){
                q.pop();
                continue;
            }
            if(i==di&&j==dj){
                ok=true;
                break;
            }
            q.pop();
            for(int k=0;k<4;k++){
                int ni=i+dx[k],nj=j+dy[k];
                if(ni<0||nj<0||ni>=n||nj>=n) continue;
                if(a[ni][nj]=='T') continue;
                if(dist[i][j]+1<dist[ni][nj]){
                    dist[ni][nj]=dist[i][j]+1;
                    q.push({ni,nj});
                }
            }
        }
        if(ok) lo=mid;
        else hi=mid-1;
    }
    cout<<lo;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...