Submission #1240203

#TimeUsernameProblemLanguageResultExecution timeMemory
1240203adriines06Mecho (IOI09_mecho)C++20
3 / 100
1096 ms131072 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dX[]={1,-1,0,0};
int dY[]={0,0,1,-1};
int n,s;
vector<vector<int>>dis;
pair<int,int>start,fin;
vector<vector<char>>lab;
bool des2(int x,int y,int e){
    vector<vector<int>>disb(n,vector<int>(n,-1));
    queue<pair<int,int>>q;
    q.push({x,y});
    disb[x][y]=e;
    while(!q.empty()){
        auto p =q.front();
        q.pop();
        int i=p.first,j=p.second;
        for(int k=0;k<4;k++){
            int nX=i+dX[k],nY=j+dY[k];
            if(nX>=0 && nY>=0 && nY<n && nX<n && (lab[nX][nY]=='G' or lab[nX][nY]=='D')){
                int st=disb[i][j]-e+1;
                //cout<<st<<"\n";
                int mini=(st)/s;
                mini+=e;
                //cout<<mini<<"\n";
                if(dis[nX][nY]>mini){
                    //cout<<i<<" "<<j<<"->"<<nX<<" "<<nY<<" "<<mini<<"\n";
                    disb[nX][nY]=disb[i][j]+1;
                    q.push({nX,nY});
                }
                
            }
        }
        
    }
    //cout<<disb[fin.first][fin.second];
    return disb[fin.first][fin.second]!=-1;
}
void ff(int x,int y){
    for(int i=0;i<4;i++){
        int nX=x+dX[i],nY=y+dY[i];
        if(nX>=0 && nY>=0 && nY<n && nX<n){
            if(dis[x][y]+1<dis[nX][nY]){
                dis[nX][nY]=dis[x][y]+1;
                ff(nX,nY);
            }
        }
    }
}
void solve(){
    cin>>n>>s;
    lab.assign(n,vector<char>(n));
    vector<pair<int,int>>st;
    dis.assign(n,vector<int>(n,1e5));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>lab[i][j];
            if(lab[i][j]=='H'){
                st.push_back({i,j});
            }
            else if(lab[i][j]=='M'){
                    start.first=i;
                    start.second=j;
            }
            else if(lab[i][j]=='D'){
                fin.first=i;
                fin.second=j;
            }
        }
    }
    for(int i=0;i<st.size();i++){
        int x=st[i].first, y=st[i].second;
        dis[x][y]=0;
        ff(x,y);
    }
    int l=0,r=n*n+1;
    while(l<r-1){
        int m=(l+r)/2;
        if(des2(start.first,start.second,m)){
            l=m;
        }
        else r=m-1;
    }
    //cout<<l<<" "<<r<<"\n";
    if(des2(start.first,start.second,r)) cout<<r;
    else if(des2(start.first,start.second,l)) cout<<l;
    else cout<<-1;

}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...