Submission #869026

#TimeUsernameProblemLanguageResultExecution timeMemory
869026HuyQuang_re_ZeroMecho (IOI09_mecho)C++14
100 / 100
153 ms7512 KiB
#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 timeMemoryGrader output
Fetching results...