Submission #1038625

#TimeUsernameProblemLanguageResultExecution timeMemory
1038625TepeyacMecho (IOI09_mecho)C++11
10 / 100
186 ms65536 KiB
#include <bits/stdc++.h>

using namespace std;

struct Cell 
{
    int x, y;
};

int n, s;
pair<int, int> pos;
char ma[801][801];
int enj[801][801];
bool vb[801][801];
int pa[801][801];

int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

bool isvalid(int i, int j) 
{
    return i >= 1 && i <= n && j >= 1 && j <= n; 
}

bool monotone(int m) 
{
    queue<Cell> q;

    memset(pa, 0, sizeof(pa));
    memset(vb, false, sizeof(vb));

   Cell nodo = {pos.first, pos.second};
   q.push(nodo);
   pa[nodo.x][nodo.y] = m;
   vb[pos.first][pos.second] = true;

    while(!q.empty()) 
    {
        Cell Nodo = q.front();
        q.pop();

        for(int i = 0; i < 4; ++i) 
        {
            for(int j = 1; j <= s; ++j) 
            {
                int nx = Nodo.x + j * dx[i];
                int ny = Nodo.y + j * dy[i];

                if(!isvalid(nx, ny) || ma[nx][ny] == 'H' || ma[nx][ny] == 'T' && pa[nx][ny] + 1 >= enj[nx][ny] && vb[nx][ny]) 
                    break;

                    if(ma[nx][ny] == 'D') 
                    {
                        return true;
                    }

                    vb[nx][ny] = true;
                    pa[nx][ny] = pa[Nodo.x][Nodo.y] + 1;
                    q.push({nx, ny});
                
            }
        }
    }

    return false;
}

int BSOTA(int a, int b) 
{
    while(a + 1 < b) 
    {
        int m = (a + b) / 2;
        if(monotone(m)) 
        {
            a = m;
        } else 
        {
            b = m;
        }
    }
    return a;
}

int main() 
{
    cin.tie(0) -> sync_with_stdio(0);

    cin >> n >> s;

    
    queue<pair<int, int>> q;

    for(int i = 1; i <= n; ++i) 
    {
        for(int j = 1; j <= n; ++j) 
        {
            cin >> ma[i][j];
            if(ma[i][j] == 'H') 
            {
                q.push({i, j});
                enj[i][j] = 0;
            } 
            else 
            {
                enj[i][j] = -1;
            }
            if(ma[i][j] == 'M') 
            {
                pos = {i, j};
            }
        }
    }

    while(!q.empty()) 
    {
        int i2 = q.front().first, j2 = q.front().second;
        q.pop();

        for(int i = 0; i < 4; ++i) 
        {
            int nx = dx[i] + i2;
            int ny = dy[i] + j2;

            if(isvalid(nx, ny) && ma[nx][ny] != 'D' && ma[nx][ny] != 'T' && ma[nx][ny] != 'H' && enj[nx][ny] == -1) 
            {
                q.push({nx, ny});
                enj[nx][ny] = enj[i2][j2] + 1;
            }
        }
    }

    int maxx = enj[pos.first][pos.second];
   
        cout << BSOTA(0, maxx - 1) - 1 << "\n";
    
    return 0;
}

Compilation message (stderr)

mecho.cpp: In function 'bool monotone(int)':
mecho.cpp:49:112: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   49 |                 if(!isvalid(nx, ny) || ma[nx][ny] == 'H' || ma[nx][ny] == 'T' && pa[nx][ny] + 1 >= enj[nx][ny] && vb[nx][ny])
      |                                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
mecho.cpp:49:17: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   49 |                 if(!isvalid(nx, ny) || ma[nx][ny] == 'H' || ma[nx][ny] == 'T' && pa[nx][ny] + 1 >= enj[nx][ny] && vb[nx][ny])
      |                 ^~
mecho.cpp:52:21: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   52 |                     if(ma[nx][ny] == 'D')
      |                     ^~
#Verdict Execution timeMemoryGrader output
Fetching results...