Submission #1208555

#TimeUsernameProblemLanguageResultExecution timeMemory
1208555timeflewMecho (IOI09_mecho)C++20
5 / 100
135 ms4580 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define ff first
#define ss second
#define all(x) x.begin(), x.end()

const int mxN=8e2;

char c[mxN][mxN];
int vis[mxN][mxN];
bool vis1[mxN][mxN];
pair<int, int> st, ed;
int n, s;
int dx[4]={0, 0, 1, -1};
int dy[4]={1, -1, 0, 0};

bool valid(int x, int y) {
  return (x>=0&&x<n&&y>=0&&y<n&&c[x][y]!='T');
}

bool check(int x) {
  queue<array<int, 4>> q;//x y step state_s
  q.push({st.ff, st.ss, x+1, 0});
  memset(vis1, 0, sizeof(vis1));
  vis1[st.ff][st.ss]=1;
  while(q.size()) {
      auto [xx, yy, step, state]=q.front();
      if(ed.ff==xx&&ed.ss==yy) return 1;
      q.pop();
      for(int i=0; i<4; i++) {
          int nx=xx+dx[i], ny=yy+dy[i];
          if(valid(nx, ny)&&vis[nx][ny]>step&&!vis1[nx][ny]) {
              state++;
              vis1[nx][ny]=1;
              if(state==s) {
                  // if(step+1==vis[nx][ny]) continue;
                  q.push({nx, ny, step+1, 1});
              } else {
                  q.push({nx, ny, step, state+1});
              }
          }
      } 
  }
  return 0;
}

int main() {
  ios::sync_with_stdio(0); cin.tie(0);
  cin>>n>>s;
  queue<array<int, 3>> q;
  memset(vis, 0x3f, sizeof(vis));
  for(int i=0; i<n; i++) {
      for(int j=0; j<n; j++) {
          cin>>c[i][j];// t g m d h
          if(c[i][j]=='M') st={i, j};
          if(c[i][j]=='D') ed={i, j};
          if(c[i][j]=='H') q.push({i, j, 0}), vis[i][j]=0;
      }
  }
  while(q.size()) {
      auto [x, y, now]=q.front();
      q.pop();
      for(int i=0; i<4; i++) {
          int nx=x+dx[i], ny=y+dy[i];
          if(vis[nx][ny]==0x3f3f3f3f&&valid(nx, ny)) {
              vis[nx][ny]=now+1;
              q.push({nx, ny, now+1});
          }
      }
  }
  int l=0, r=s, ans=-1;
  while(l<=r) {
      int mid=(l+r)/2;
      if(check(mid)) {
          ans=mid;
          l=mid+1;
      } else {
          r=mid-1;
      }
  }
  cout<<ans<<"\n";
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...