제출 #891842

#제출 시각아이디문제언어결과실행 시간메모리
891842bashNewbieMecho (IOI09_mecho)C++17
100 / 100
205 ms9520 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;

#define fast_io ios::sync_with_stdio(0), cin.tie(0)
#define pb push_back
template <typename T> using vt = vector<T>;
using vi = vt<int>;
using vs = vt<string>;

const int inf = 0x3f3f3f3f;

int main() {
	fast_io;

	int N, n, d; cin >> N >> d, n = N*N;
	vs s(N); int srt, fin; vi hiv;
	for(int i = 0; i < N; i++) {
		cin >> s[i];
		for(int j = 0; j < N; j++) {
			int x = i*N+j;
			if(s[i][j] == 'M') srt = x;
			if(s[i][j] == 'D') fin = x;
			if(s[i][j] == 'H') hiv.pb(x); 
		}
	}
	queue<int> q; vi hdis(n, inf), dis; int f;

	auto put = [&] (int x, int y, int c) {
		if(c == 0) {
			if(hdis[y] < inf) return;
			int a = y/N, b = y-a*N;
			if(s[a][b] == 'T' || s[a][b] == 'D') return;
			q.push(y), hdis[y] = hdis[x]+1;
		} else
		if(c == 1) {
			if(dis[y] < inf) return;
			if(y == fin) {
				q.push(y), dis[y] = 0;
				return;
			}
			int a = y/N, b = y-a*N;
			if(s[a][b] == 'T') return;
			
			int tim = f+(dis[x]+1)/d;
			if(hdis[y] <= tim) return;
			q.push(y), dis[y] = dis[x]+1;
		}
	};
	auto bfs = [&] (int c) {
		while(!q.empty()) {
			int x = q.front(); q.pop();
			if(x == fin) {
				while(!q.empty()) q.pop();
				return;
			}

			if(x%N > 0) put(x, x-1, c);
			if(x%N<N-1) put(x, x+1, c);
			if(x/N > 0) put(x, x-N, c);
			if(x/N<N-1) put(x, x+N, c);
		}
	};

	for(int x: hiv) q.push(x), hdis[x] = 0;
	bfs(0);

	auto poss = [&] (int m) {
		if(m >= hdis[srt]) return 0;

		q.push(srt), dis = vi(n, inf), dis[srt] = 0, f = m;
		bfs(1);
		return dis[fin] < inf? 1: 0;
	};
	
	int l = -1, r = inf, m;
	while(l < r) {
		m = l+r+1 >> 1;
		if(poss(m)) l = m; else
		r = m-1;
	}
	cout << l << "\n";
}

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

mecho.cpp: In function 'int main()':
mecho.cpp:81:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   81 |   m = l+r+1 >> 1;
      |       ~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...