# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
869026 | HuyQuang_re_Zero | Mecho (IOI09_mecho) | C++14 | 153 ms | 7512 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define db long double
#define N 805
#define II pair <ll,ll>
#define III pair <ll,II>
#define IV pair <vector <int>,vector <int> >
#define fst first
#define snd second
#define BIT(x,i) ((x>>i)&1)
#define Log(x) (31-__builtin_clz((int)x))
#define LogLL(x) (63-__builtin_clzll((ll)x))
#define pi acos(-1)
#define to_radian(x) (x*pi/180.0)
#define to_degree(x) (x*180.0/pi)
using namespace std;
queue <II> q;
int n,i,j,x,y,bee[N][N],bear[N][N],s,X,Y;
char a[N][N];
void bee_consider(int x,int y,int k)
{
if(bee[x][y]>k && (a[x][y]=='H' || a[x][y]=='M' || a[x][y]=='G'))
{
q.push({ x,y });
bee[x][y]=k;
}
}
void bear_consider(int x,int y,int k)
{
if(bear[x][y]>k && (a[x][y]=='M' || a[x][y]=='D' || a[x][y]=='G'))
{
if(k/s>=bee[x][y]) return ;
q.push({ x,y });
bear[x][y]=k;
}
}
bool check(int k)
{
memset(bear,63,sizeof(bear));
while(q.size()>0) q.pop();
bear_consider(X,Y,k*s);
while(q.size()>0)
{
int x=q.front().fst,y=q.front().snd,k=bear[x][y]; q.pop();
if(a[x][y]=='D') return 1;
bear_consider(x-1,y,k+1);
bear_consider(x+1,y,k+1);
bear_consider(x,y-1,k+1);
bear_consider(x,y+1,k+1);
}
return 0;
}
int main()
{
// freopen("mecho.inp","r",stdin);
//freopen("mecho.out","w",stdout);
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>s;
memset(bee,63,sizeof(bee));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='H') bee_consider(i,j,0);
if(a[i][j]=='M') X=i,Y=j;
}
while(q.size()>0)
{
int x=q.front().fst,y=q.front().snd; q.pop();
bee_consider(x-1,y,bee[x][y]+1);
bee_consider(x+1,y,bee[x][y]+1);
bee_consider(x,y-1,bee[x][y]+1);
bee_consider(x,y+1,bee[x][y]+1);
}
int l=0,r=n*n+1;
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid)) l=mid; else r=mid-1;
}
if(check(l)) cout<<l; else cout<<-1;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |