# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1260836 | _unknown_2010 | Mecho (IOI09_mecho) | C++20 | 0 ms | 0 KiB |
// ... (sarlavha va includes o'zi kabi)
void solution() {
int n,s;
cin >> n >> s;
vi<string> a(n);
const int INF = 1e9;
vi<vi<int>> dist(n, vi<int> (n, INF));
queue<pair<int,int>> q;
int sx=-1, sy=-1, ex=-1, ey=-1;
for(int i=0; i<n; i++){
cin >> a[i];
for(int j=0; j<n; j++){
if(a[i][j]=='H'){
dist[i][j]=0;
q.push({i, j});
}
if(a[i][j]=='M'){
sx=i; sy=j;
}
if(a[i][j]=='D'){
ex=i; ey=j;
}
}
}
auto isvalid = [&](int nx, int ny) -> bool {
if(nx<0 || ny<0) return false;
if(nx>=n || ny>=n) return false;
if(a[nx][ny]!='G' && a[nx][ny]!='M') return false;
return true;
};
while(!q.empty()){
auto [x,y]=q.front(); q.pop();
for(int i=0;i<4;i++){
int nx=x+dx[i], ny=y+dy[i];
if(isvalid(nx, ny) && dist[nx][ny]==INF){
dist[nx][ny]=dist[x][y]+1;
q.push({nx, ny});
}
}
}
int l=-1, r=n*n;
while(l<r){
int mid=(l+r+1)/2;
queue<pair<int,int>> qq;
bool ok = false;
// if bees already at start at or before mid -> impossible
if (dist[sx][sy] <= mid) {
ok = false;
} else {
qq.push({sx, sy});
vi<vi<char>> vis(n, vi<char>(n,0));
vi<vi<int>> mt(n, vi<int>(n,0));
vis[sx][sy]=1; mt[sx][sy]=0;
while(!qq.empty() && !ok){
auto [x,y]=qq.front(); qq.pop();
for(int i=0;i<4;i++){
int nx=x+dx[i], ny=y+dy[i];
// if stepping straight into home
if(nx==ex && ny==ey){
int needed = (mt[x][y] + 1 + s - 1) / s;
if (dist[ex][ey] > mid + needed) { ok = true; break; }
else continue;
}
if(!isvalid(nx, ny)) continue;
if(vis[nx][ny]) continue;
int needed = (mt[x][y] + 1 + s - 1) / s;
if(dist[nx][ny] > mid + needed){
vis[nx][ny]=1;
mt[nx][ny]=mt[x][y]+1;
qq.push({nx, ny});
}
}
}
}
if(ok) l = mid;
else r = mid-1;
}
cout << l << '\n';
}