Submission #1300083

#TimeUsernameProblemLanguageResultExecution timeMemory
1300083scalifrastico_098Mecho (IOI09_mecho)C++20
100 / 100
150 ms8696 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long int n, m, x, y, u, v, k=-1; vector<vector<char>> a; vector<vector<int>> dist; vector<vector<pair<int, int>>> dis; int inf=1e9; void fl1() { queue<array<int, 2>> q; for(int i=0; i<n; i++) { for(int j=0; j<n; j++){if(a[i][j]=='H'){dist[i][j]=0; q.push({i, j});}} } while(!q.empty()) { auto u1=q.front(); q.pop(); if(u1[0]>0&&dist[u1[0]-1][u1[1]]>dist[u1[0]][u1[1]]+1&&(a[u1[0]-1][u1[1]]=='G'||a[u1[0]-1][u1[1]]=='M')) { dist[u1[0]-1][u1[1]]=dist[u1[0]][u1[1]]+1; q.push({u1[0]-1,u1[1]}); } if(u1[0]<n-1&&dist[u1[0]+1][u1[1]]>dist[u1[0]][u1[1]]+1&&(a[u1[0]+1][u1[1]]=='G'||a[u1[0]+1][u1[1]]=='M')) { dist[u1[0]+1][u1[1]]=dist[u1[0]][u1[1]]+1; q.push({u1[0]+1,u1[1]}); } if(u1[1]>0&&dist[u1[0]][u1[1]-1]>dist[u1[0]][u1[1]]+1&&(a[u1[0]][u1[1]-1]=='G'||a[u1[0]][u1[1]-1]=='M')) { dist[u1[0]][u1[1]-1]=dist[u1[0]][u1[1]]+1; q.push({u1[0],u1[1]-1}); } if(u1[1]<n-1&&dist[u1[0]][u1[1]+1]>dist[u1[0]][u1[1]]+1&&(a[u1[0]][u1[1]+1]=='G'||a[u1[0]][u1[1]+1]=='M')) { dist[u1[0]][u1[1]+1]=dist[u1[0]][u1[1]]+1; q.push({u1[0],u1[1]+1}); } } } bool solve(int x1) { if(x1>=dist[x][y]) return false; dis.assign(n, vector<pair<int, int>> (n)); for(int i=0; i<n; i++){for(int j=0; j<n; j++)dis[i][j]={inf, inf};} queue<array<int, 2>> q; q.push({x, y}); dis[x][y]={x1, 0}; while(!q.empty()) { auto u=q.front(); q.pop(); pair<int, int> ngh=dis[u[0]][u[1]]; ngh.second++; if(ngh.second==m){ngh.first++; ngh.second=0;} if(u[0]>0&&dist[u[0]-1][u[1]]>ngh.first&&ngh<dis[u[0]-1][u[1]]&&(a[u[0]-1][u[1]]!='T'&&a[u[0]-1][u[1]]!='H')) { dis[u[0]-1][u[1]]=ngh; if(a[u[0]-1][u[1]]=='D')return true; q.push({u[0]-1,u[1]}); } if(u[0]<n-1&&dist[u[0]+1][u[1]]>ngh.first&&ngh<dis[u[0]+1][u[1]]&&(a[u[0]+1][u[1]]!='T'&&a[u[0]+1][u[1]]!='H')) { dis[u[0]+1][u[1]]=ngh;if(a[u[0]+1][u[1]]=='D')return true; q.push({u[0]+1,u[1]}); } if(u[1]>0&&dist[u[0]][u[1]-1]>ngh.first&&ngh<dis[u[0]][u[1]-1]&&(a[u[0]][u[1]-1]!='T'&&a[u[0]][u[1]-1]!='H')) { dis[u[0]][u[1]-1]=ngh; if(a[u[0]][u[1]-1]=='D')return true; q.push({u[0],u[1]-1}); } if(u[1]<n-1&&dist[u[0]][u[1]+1]>ngh.first&&ngh<dis[u[0]][u[1]+1]&&(a[u[0]][u[1]+1]!='T'&&a[u[0]][u[1]+1]!='H')) { dis[u[0]][u[1]+1]=ngh; if(a[u[0]][u[1]+1]=='D')return true; q.push({u[0],u[1]+1}); } } return false; } int main() { cin>>n>>m; a.assign(n, vector<char> (n));dist.assign(n, vector<int> (n, inf)); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cin>>a[i][j]; if(a[i][j]=='M'){x=i; y=j;} if(a[i][j]=='D'){u=i; v=j;} } } fl1(); int l=0, r=inf; while(l<=r) { int m=(l+r)/2; if(solve(m)){k=m; l=m+1;} else r=m-1; } cout<<k<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...