제출 #500218

#제출 시각아이디문제언어결과실행 시간메모리
500218NartifactMecho (IOI09_mecho)C++17
95 / 100
177 ms4356 KiB
#include <bits/stdc++.h>
using namespace std;

#define forinc(i,a,b) for(int i=a;i<=b;++i)
#define fordec(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
#define eb emplace_back
#define pii pair <int,int>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int N = 802, inf = 2e9;
const int H[] = {1, 0, -1, 0};
const int C[] = {0, 1, 0, -1};
int n, s;
char a[N][N];
int t[N][N];
bool cx[N][N];
pii sta, fin;

bool valid (const int& x, const int& y)
{
    return x && y && x <= n && y <= n
          && a[x][y] != 'T';
}

struct adt {int x, y, step;};

bool ok (const int& tg)
{
    queue <adt> q;
    memset(cx, 0, sizeof cx);
    q.push({sta.fi, sta.se, 0});
    cx[sta.fi][sta.se] = 1;
    while(q.size()) {
        auto [x, y, st] = q.front(); q.pop();
        if(x == fin.fi && y == fin.se) return 1;
        forinc(i,0,3) {
            int nh = x + H[i];
            int nc = y + C[i];
            if(!valid(nh, nc) || cx[nh][nc]) continue;
            if((st + 1) / s < t[nh][nc] - tg)
                q.push({nh, nc, st + 1}),
                cx[nh][nc] = 1;
        }
    }
    return 0;
}

void solve ()
{
    queue <pii> q;
    forinc(i,1,n) forinc(j,1,n) {
        t[i][j] = inf;
        if(a[i][j] == 'H') {
            q.push({i, j});
            t[i][j] = 0;
        }
        else if(a[i][j] == 'M') sta = {i, j};
        else if(a[i][j] == 'D') fin = {i, j};
    }

    // bfs bee
    while(q.size()) {
        auto x = q.front(); q.pop();
        forinc(i,0,3) {
            int nh = x.fi + H[i];
            int nc = x.se + C[i];
            if(valid(nh, nc) && t[nh][nc] > t[x.fi][x.se] + 1) {
                t[nh][nc] = t[x.fi][x.se] + 1;
                q.push({nh, nc});
            }
        }
    }
	t[fin.fi][fin.se] = inf;
    // binary search
    int l = 0, r = t[sta.fi][sta.se] - 1, ans = -1;
    while(l <= r) {
        int mid = l + r >> 1;
        if(ok(mid)) {
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    cout << ans;
}

void read ()
{
    cin >> n >> s;
    forinc(i,1,n) forinc(j,1,n)
        cin >> a[i][j];
    solve();
}

main ()
{
	#define task "ioi09_mecho"
	cin.tie(0) -> sync_with_stdio(0);
	if(fopen (task ".inp", "r")) {
		freopen (task ".inp", "r", stdin);
		freopen (task ".out", "w", stdout);
	}
    read();
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

mecho.cpp: In function 'void solve()':
mecho.cpp:82:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   82 |         int mid = l + r >> 1;
      |                   ~~^~~
mecho.cpp: At global scope:
mecho.cpp:100:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  100 | main ()
      | ^~~~
mecho.cpp: In function 'int main()':
mecho.cpp:105:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |   freopen (task ".inp", "r", stdin);
      |   ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
mecho.cpp:106:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |   freopen (task ".out", "w", stdout);
      |   ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...