제출 #500710

#제출 시각아이디문제언어결과실행 시간메모리
500710beedleMecho (IOI09_mecho)C++14
100 / 100
630 ms12020 KiB
#include <iostream> #include <iomanip> #include <vector> #include <algorithm> #include <set> #include <iterator> #include <stack> #include <map> #include <math.h> #include <bitset> #include <deque> #include <string> #include <tuple> #include <queue> #include <numeric> #include <unordered_set> #include <unordered_map> #define pi 3.141592653589793238 #define ll long long #define ld long double #define rep(i, a, b) for (long long i = a; i <= b; i++) #define mod 998244353ll #define INF 1000000000000000000 #define pb push_back #define ff first #define ss second #define endl '\n' #define all(x) (x).begin (), (x).end () #define sz(x) (ll) (x).size () #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin()) #define rank rnk #define log lg #define fast \ ios_base::sync_with_stdio (false); \ cin.tie (NULL); \ cout.tie (NULL) using namespace std; vector <pair<int,int>> dir={{0,1},{0,-1},{1,0},{-1,0}}; signed main () { fast; // freopen("atlarge.in","r",stdin); // freopen("atlarge.out","w",stdout); int n,s; cin>>n>>s; string g[n]; rep(i,0,n-1) cin>>g[i]; int lo=0; int hi=n*n; int best=-1; while(lo<=hi) { int mid=(lo+hi)/2; queue <pair<int,int>> q; int disth[n][n]; rep(i,0,n-1) rep(j,0,n-1) disth[i][j]=mod; rep(i,0,n-1) rep(j,0,n-1) if(g[i][j]=='H') disth[i][j]=0, q.push({i,j}); while(!q.empty()) { auto v=q.front(); q.pop(); if(disth[v.ff][v.ss]==mid) continue; for(auto mv:dir) { pair <int,int> u={v.ff+mv.ff,v.ss+mv.ss}; if(u.ff>=0 && u.ff<n && u.ss>=0 && u.ss<n) if(g[u.ff][u.ss]=='G' || g[u.ff][u.ss]=='M') if(disth[u.ff][u.ss]>disth[v.ff][v.ss]+1) { disth[u.ff][u.ss]=disth[v.ff][v.ss]+1; q.push(u); } } } rep(i,0,n-1) rep(j,0,n-1) if(disth[i][j]!=mod) { disth[i][j]=0; q.push({i,j}); } while(!q.empty()) { auto v=q.front(); q.pop(); for(auto mv:dir) { pair <int,int> u={v.ff+mv.ff,v.ss+mv.ss}; if(u.ff>=0 && u.ff<n && u.ss>=0 && u.ss<n) if(g[u.ff][u.ss]=='G' || g[u.ff][u.ss]=='M') if(disth[u.ff][u.ss]>disth[v.ff][v.ss]+1) { disth[u.ff][u.ss]=disth[v.ff][v.ss]+1; q.push(u); } } } // rep(i,0,n-1) // { // rep(j,0,n-1) // { // if(disth[i][j]==mod) // cout<<"-"; // else // cout<<disth[i][j]; // } // cout<<endl; // } // cout<<endl; int distm[n][n]; rep(i,0,n-1) rep(j,0,n-1) distm[i][j]=mod; pair <int,int> start; rep(i,0,n-1) rep(j,0,n-1) if(g[i][j]=='M') start={i,j}; distm[start.ff][start.ss]=0; if(disth[start.ff][start.ss]!=0) q.push(start); while(!q.empty()) { auto v=q.front(); q.pop(); for(auto mv:dir) { pair <int,int> u={v.ff+mv.ff,v.ss+mv.ss}; if(u.ff>=0 && u.ff<n && u.ss>=0 && u.ss<n) if(g[u.ff][u.ss]=='G' || g[u.ff][u.ss]=='M' || g[u.ff][u.ss]=='D') if(distm[u.ff][u.ss]>distm[v.ff][v.ss]+1) { if((distm[v.ff][v.ss]+1)/s<disth[u.ff][u.ss]) { distm[u.ff][u.ss]=distm[v.ff][v.ss]+1; q.push(u); } } } } // rep(i,0,n-1) // { // rep(j,0,n-1) // { // if(distm[i][j]==mod) // cout<<"-"; // else // cout<<distm[i][j]; // } // cout<<endl; // } // cout<<endl; // bool cango[n][n], visited[n][n]; // rep(i,0,n-1) // rep(j,0,n-1) // { // if(distm[i][j]/s<disth[i][j] && g[i][j]!='T') // cango[i][j]=true; // else // cango[i][j]=false; // visited[i][j]=false; // } // if(cango[start.ff][start.ss]) // q.push(start), visited[start.ff][start.ss]=true; // rep(i,0,n-1) // { // rep(j,0,n-1) // { // if(cango[i][j]) // cout<<"+"; // else // cout<<"-"; // } // cout<<endl; // } // cout<<endl; // while(!q.empty()) // { // auto v=q.front(); // q.pop(); // for(auto mv:dir) // { // pair <int,int> u={v.ff+mv.ff,v.ss+mv.ss}; // if(u.ff>=0 && u.ff<n && u.ss>=0 && u.ss<n) // if(cango[u.ff][u.ss]) // if(!visited[u.ff][u.ss]) // { // visited[u.ff][u.ss]=true; // q.push(u); // } // } // } bool ok=false; rep(i,0,n-1) rep(j,0,n-1) if(g[i][j]=='D') if(distm[i][j]!=mod) ok=true; if(ok) { best=mid; lo=mid+1; } else { hi=mid-1; } } cout<<best; return 0; } /* 7 3 TTTTTTT TGGGGGT TGGGGGT MGGGGGD TGGGGGT TGGGGGT THHHHHT */
#Verdict Execution timeMemoryGrader output
Fetching results...