Submission #543414

#TimeUsernameProblemLanguageResultExecution timeMemory
543414codebuster_10Mecho (IOI09_mecho)C++17
13 / 100
243 ms11508 KiB
#include <bits/stdc++.h>
#define int int64_t //be careful about this 
 
using namespace std;
 
#define vt vector 
#define ar array 
#define pr pair 
 
#define f first 
#define s second
 
#define pb push_back
#define eb emplace_back
 
#define fr(i,a,b) for(int i = a; i < b; ++i)
#define rf(i,a,b) for(int i = a-1; i >= b; --i)
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
 
namespace IN{
  template<class T> void re(vector<T> &A);
  template<class S,class T> void re(pair<S,T> &A);
  template<class T,size_t N> void re(array<T,N> &A);
 
  template<class T> void re(T& x){ 
    cin >> x;}
  template<class H, class... T> void re(H& h, T&... t){ 
    re(h); re(t...);}
 
  template<class T> void re(vector<T> &A){ 
    for(auto& x : A) re(x);}
  template<class S,class T> void re(pair<S,T> &A){ 
      re(A.first); re(A.second);}
  template<class T,size_t N> void re(array<T,N> &A){
    for(int i = 0; i < N; ++i)  re(A[i]);}
}
 
namespace OUT{
  template<class T>
  void __p(const T& a){ cout<<a; }
  template<class T, class F>
  void __p(const pair<T, F>& a){ cout<<"{"; __p(a.first); cout<<","; __p(a.second); cout<<"}\n"; }
  template<class T, size_t N>
  void __p(const array<T,N>& a){ cout<<"{"; for(int i=0;i<N;++i)__p(a[i]),cout<<",}\n"[i+1==N]; }
  template<class T>
  void __p(const vector<T>& a){
    cout<<"{";for(auto it=a.begin();it<a.end();it++)__p(*it),cout<<",}\n"[it+1==a.end()]; }
  template<class T, class ...Arg>
  void __p(T a1, Arg ...a){__p(a1); __p(a...); }
  template<class Arg1>
  void __f(const char *s, Arg1 &&arg1){ cout<<s<<" : "; __p(arg1); cout<<endl; }
  template<class Arg1, class ... Args>
  void __f(const char *ss, Arg1 &&arg1, Args &&... args){
    int b=0,i=0; do{ if(ss[i]=='(') b++; if(ss[i]==')') b--; i++;}while(!(ss[i]==','&&b==0));
    const char *comma=ss+i; cout.write(ss,comma-ss)<<" : ";__p(arg1);cout<<" | ";__f(comma+1,args...);}
  #define trace(...) cout<<"Line:"<<__LINE__<<"  ", __f(#__VA_ARGS__, __VA_ARGS__)
}
 
 
namespace FUN{
  void IO(string s = ""){
    ios_base::sync_with_stdio(NULL); 
    cin.tie(nullptr); 
    cout.precision(20); 
    cout << fixed;
    if(!s.empty()){
      freopen((s+".in").c_str(),"r",stdin);
      freopen((s+".out").c_str(),"w",stdout);
    }
  }
 
  const auto start_time = chrono::high_resolution_clock::now();
  void output_run_time(){
    // will work for ac,cc&&cf.
#ifndef ONLINE_JUDGE
    auto end_time = chrono::high_resolution_clock::now();
    chrono::duration<double> diff = end_time-start_time;
      cout << "\n\n\nTime Taken : " << diff.count();
#endif
  }
 
  template<class T> bool ckmin(T& a, const T& b){ 
    return b < a ? a = b, true : false; }
    
  template<class T> bool ckmax(T& a, const T& b){ 
    return a < b ? a = b, true : false; }
 
  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  int my_rand(int L, int R){ 
    return uniform_int_distribution<int>(L,R)(rng); }
  
  template<class T> int sz(const T& x){ 
    return int(x.size()); }
 
  template<class T> int lb(const vector<T>& vec,const T& val){
    return int(lower_bound(vec.begin(), vec.end(),val) - vec.begin()); }
 
  template<class T> int ub(const vector<T>& vec,const T& val){
    return int(upper_bound(vec.begin(), vec.end(),val) - vec.begin()); }
 
  constexpr int  dx[4] = {1,0,-1,0};
  constexpr int  dy[4] = {0,1,0,-1};
  constexpr char dr[4] = {'D','R','U','L'};
 
  constexpr long long INFLL1 = 1e16, INFLL2 = 9e18;
  constexpr int INF = 2e9;
 
  template<class T>
  vector<T> V(int n,T val){
    return vector<T> (n,val);
  }
 
  template<class T>
  vector<vector<T>> V(int n,int m,T val){
    return vector<vector<T>> (n,vector<T> (m,val));
  }
 
  template<class T>
  vector<vector<vector<T>>> V(int n,int m,int k,T val){
    return vector<vector<vector<T>>> (n,vector<vector<T>> (m,vector<T> (k,val)));
  }
}
 
 
using namespace IN;
using namespace OUT;
using namespace FUN;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
signed main(){
  IO();
  
  int N,S;
  re(N,S);
 
  auto grid = V<char>(N,N,' ');
  re(grid);
 
  auto t = V<int>(N,N,-1);
  auto v = V<bool>(N,N,false);
 
  queue<pr<int,int>> q;
 
  fr(i,0,N){
    fr(j,0,N){
      if(grid[i][j] == 'H'){
        t[i][j] = 0;
        v[i][j] = true;
        q.push({i,j});
      }
    }
  }
 
  
 
  while(!q.empty()){
    auto [i,j] = q.front(); q.pop();
    fr(k,0,4){
      int ni=i+dx[k],nj=j+dy[k];
      if(ni >= 0 && ni < N && nj >= 0 && nj < N && !v[ni][nj] && grid[ni][nj] == 'G'){
        t[ni][nj] = t[i][j] + 1;
        v[ni][nj] = true;
        q.push({ni,nj});
      }
    }
  }
 
  int si,sj,ei,ej;
 
  fr(i,0,N){
    fr(j,0,N){
      if(grid[i][j] == 'M')
        si=i,sj=j;
      if(grid[i][j] == 'D')
        ei=i,ej=j;
    }
  }
 
  auto f = [&](int wait) -> bool {
    auto vis = V<bool>(N,N,false);
    auto dis = V<int>(N,N,-1);
    queue<pr<int,int>> q;
 
    vis[si][sj] = true;
    dis[si][sj] = 0;
    q.push({si,sj});
 
    int now = 0;
    while(!q.empty()){
      queue<pr<int,int>> nq;
      while(!q.empty()){
        auto [i,j] = q.front(); q.pop();
        if(dis[i][j] == S){
          nq.push({i,j});
          dis[i][j] = 0;
          continue;
        }
        fr(k,0,4){
          int ni=i+dx[k],nj=j+dy[k];
          if(ni >= 0 && ni < N && nj >= 0 && nj < N && !vis[ni][nj] && (grid[ni][nj] == 'D' || grid[ni][nj] == 'G' &&  t[ni][nj] > wait + now)){  
            if(grid[ni][nj] == 'D')
              return true;
            dis[ni][nj] = dis[i][j] + 1;
            vis[ni][nj] = true;
            q.push({ni,nj});
          }
        }
      }
      q = nq;
      now++;
    }
 
    return false;
  };
 
  if(!f(0)){
    cout << "-1";
    return 0;
  }
 
  int lo = 0, hi = 2*N+1;
 
  while(hi - lo > 1){
    int mid = (hi + lo)/2;
    f(mid) ? lo = mid : hi = mid;
  }
 
  cout << lo - 1;
 
 
  //output_run_time();
  return 0;
}
 

Compilation message (stderr)

mecho.cpp: In lambda function:
mecho.cpp:222:116: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
  222 |           if(ni >= 0 && ni < N && nj >= 0 && nj < N && !vis[ni][nj] && (grid[ni][nj] == 'D' || grid[ni][nj] == 'G' &&  t[ni][nj] > wait + now)){
mecho.cpp: In function 'int main()':
mecho.cpp:190:13: warning: variable 'ei' set but not used [-Wunused-but-set-variable]
  190 |   int si,sj,ei,ej;
      |             ^~
mecho.cpp:190:16: warning: variable 'ej' set but not used [-Wunused-but-set-variable]
  190 |   int si,sj,ei,ej;
      |                ^~
mecho.cpp: In function 'void FUN::IO(std::string)':
mecho.cpp:68:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |       freopen((s+".in").c_str(),"r",stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mecho.cpp:69:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |       freopen((s+".out").c_str(),"w",stdout);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...