Submission #465153

#TimeUsernameProblemLanguageResultExecution timeMemory
465153MohamedFaresNebiliMecho (IOI09_mecho)C++14
100 / 100
267 ms21696 KiB
#include <bits/stdc++.h>
using namespace std;
  int nx[4]={1, -1, 0, 0}, ny[4]={0, 0, 1, -1};
  char grid[2000][2000]; bool vis[2000][2000];
  int d[2000][2000]; int n, s, sx, sy, hx, hy;
  bool bfs(int v)
  {
    if(v*s>=d[sx][sy]) return false;
    memset(vis, 0, sizeof vis); 
    deque<pair<int, pair<int, int>>>q;
    q.push_back(make_pair(v*s, make_pair(sx, sy)));
    vis[sx][sy]=true;
    while(!q.empty()) {
      int dis=q.front().first;
      int a=q.front().second.first, b=q.front().second.second;
      q.pop_front();
      if(grid[a][b]=='D') return true;
      for(int l=0;l<4;l++) {
        int x=a+nx[l], y=b+ny[l];
        if(x>=0&&x<n&&y>=0&&y<n) {
          if(grid[x][y]!='T'&&dis+1<d[x][y]&&!vis[x][y]) {
            q.push_back(make_pair(dis+1, make_pair(x, y))); 
            vis[x][y]=true;
          }
        }
      }
    }
    return false;
  }
int main()
{
  cin>>n>>s;
  deque<pair<int, int>>q;
  memset(d, -1, sizeof(d));
  for(int l=0;l<n;l++) {
    for(int i=0;i<n;i++) 
    {
      cin>>grid[l][i];
      if(grid[l][i]=='H') {
        q.push_back(make_pair(l, i));
        d[l][i]=0;
      }
      else if(grid[l][i]=='M') {
        sx=l; sy=i; grid[l][i]='G';
      }
      else if(grid[l][i]=='D') {
        hx=l; hy=i;
      }
    }
  }
  while(!q.empty()) {
    int a=q.front().first, b=q.front().second; q.pop_front();
    for(int l=0;l<4;l++) {
      int x=a+nx[l], y=b+ny[l];
      if(x>=0&&x<n&&y>=0&&y<n&&grid[x][y]=='G'&&d[x][y]==-1) {
        d[x][y]=d[a][b]+s; q.push_back(make_pair(x, y));
      }
    }
  }
  d[hx][hy]=n*n*s;
  int lo=-1, hi=2*n*n;
  while(hi-lo>1) {
    int mid=(hi+lo)/2;
    if(bfs(mid)) lo=mid;
    else hi=mid;
  }
  cout<<lo<<'\n';
  return 0;
}




















#Verdict Execution timeMemoryGrader output
Fetching results...