Submission #1156015

#TimeUsernameProblemLanguageResultExecution timeMemory
1156015jakeob77Mecho (IOI09_mecho)C++17
84 / 100
181 ms6176 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define ll long long #define ins insert //__builtin_popcount(x); vector<pair<int,int>>dir={{-1,0},{1,0},{0,1},{0,-1}};//UDRL const int mod=1e9+7; int n,s; char grid[801][801]; vector<vector<int>>bedist; pair<int,int>mecho; pair<int,int>dom; bool good(int a,int b){ if(a<0||a>=n) return false; if(b<0||b>=n) return false; if(grid[a][b]=='G'||grid[a][b]=='M') return true; else return false; } bool bear(int a,int b,int d){ return (d/s<bedist[a][b]); } bool ok(int eat){ vector<vector<int>>dist(n,vector<int>(n,mod)); dist[mecho.first][mecho.second]=eat*s; queue<pair<int,int>>q; q.push({mecho.first,mecho.second}); while(!q.empty()){ auto cur=q.front();q.pop(); for(int i=0;i<4;i++){ int a=cur.first+dir[i].first,b=cur.second+dir[i].second; if(good(a,b)&&dist[a][b]>dist[a-dir[i].first][b-dir[i].second]+1&&bear(a,b,dist[a-dir[i].first][b-dir[i].second]+1)){ dist[a][b]=dist[a-dir[i].first][b-dir[i].second]+1; q.push({a,b}); } } }bool f=false; for(int i=0;i<4;i++){ int a=dom.first+dir[i].first,b=dom.second+dir[i].second; if(good(a,b)&&dist[a][b]!=mod){ f=true;break; } } return f; } void solve(){ cin>>n>>s; vector<pair<int,int>>hives; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ char c;cin>>c; grid[i][j]=c; if(c=='H'){ hives.pb({i,j}); } if(c=='M') mecho={i,j}; if(c=='D') dom={i,j}; } } bedist=vector<vector<int>>(n,vector<int>(n,mod)); queue<pair<int,int>>q; for(int i=0;i<(int)hives.size();i++){ q.push(hives[i]); bedist[hives[i].first][hives[i].second]=0; } while(!q.empty()){ pair<int,int>cur=q.front();q.pop(); for(int i=0;i<4;i++){ if(good(cur.first+dir[i].first,cur.second+dir[i].second)&&bedist[cur.first][cur.second]+1<bedist[cur.first+dir[i].first][cur.second+dir[i].second]){ bedist[cur.first+dir[i].first][cur.second+dir[i].second]=bedist[cur.first][cur.second]+1; q.push({cur.first+dir[i].first,cur.second+dir[i].second}); } } } if(!ok(0)) { cout<<-1<<endl; return; } int l=0,r=n*n; while(l<r){ int md=(l+r+1)/2; if(ok(md)){ l=md; } else{ r=md-1; } } cout<<l<<endl; } int main(){ int t=1; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...