Submission #53610

#TimeUsernameProblemLanguageResultExecution timeMemory
53610DiuvenMecho (IOI09_mecho)C++11
100 / 100
249 ms6564 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int MX=810, inf=2e9; int n, s; char B[MX][MX]; int xs, ys, xl, yl; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int Y[MX][MX]; bool valid(int x, int y){ return 1<=x && x<=n && 1<=y && y<=n && (B[x][y]=='G' || B[x][y]=='H'); } void bees(){ queue<pii> Q; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++){ if(B[i][j]=='H') Y[i][j]=0, Q.push({i,j}); else Y[i][j]=-1; } while(!Q.empty()){ pii p=Q.front(); Q.pop(); int x,y; tie(x,y)=p; for(int k=0; k<4; k++){ int u=x+dx[k], v=y+dy[k]; if(!valid(u,v) || Y[u][v]>=0) continue; Y[u][v]=Y[x][y]+s; Q.push({u,v}); } } } int D[MX][MX]; bool solve(int t){ for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) D[i][j]=-1; queue<pii> Q; D[xs][ys]=t*s; if(D[xs][ys]>=Y[xs][ys]) return false; Q.push({xs,ys}); while(!Q.empty()){ int x,y; tie(x,y)=Q.front(); Q.pop(); for(int k=0; k<4; k++){ int u=x+dx[k], v=y+dy[k]; if(B[u][v]=='D') return true; if(!valid(u,v) || D[u][v]>=0) continue; int now=D[x][y]+1; if(Y[u][v]>=0 && now>=Y[u][v]) continue; D[u][v]=D[x][y]+1; Q.push({u,v}); } } return false; /* cout<<"\nSOLVED "<<t<<'\n'; for(int i=1; i<=n; i++, cout<<'\n') for(int j=1; j<=n; j++) cout<<D[i][j]<<' '; */ } 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>>B[i][j]; if(B[i][j]=='M') xs=i, ys=j, B[i][j]='G'; if(B[i][j]=='D') xl=i, yl=j; } bees(); int s=0, e=n*n; while(s<e){ int m=(s+e+1)/2; if(solve(m)) s=m; else e=m-1; } cout<<(solve(s) ? s : -1); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...