Submission #345742

#TimeUsernameProblemLanguageResultExecution timeMemory
345742Kevin_Zhang_TW악어의 지하 도시 (IOI11_crocodile)C++17
100 / 100
629 ms45656 KiB
#include "crocodile.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define pb emplace_back
#define AI(i) begin(i), end(i)
template<class T> bool chmin(T &a, T b) { return b < a ? (a = b, true) : false; }
template<class T> bool chmax(T &a, T b) { return a < b ? (a = b, true) : false; }
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() { cerr << endl; }
template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
template<class T> void debug(T L, T R) { while (L != R) cerr << *L << " \n"[next(L) == R], ++L; }
#else
#define DE(...) 0
#define debug(...) 0
#endif
const int MAX_N = 100010, inf = 1e9 + 7;
vector<pair<int,int>> edge[MAX_N];

int bst[MAX_N], sec[MAX_N], fr[MAX_N];

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {
	fill(bst, bst + N, inf), fill(sec, sec + N, inf), fill(fr, fr + N, inf);
	for (int i = 0;i < M;++i) {
		int a = R[i][0], b = R[i][1], w = L[i];
		edge[a].pb(b, w);
		edge[b].pb(a, w);
	}
	// only second best should enter priority queue
	priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;

	for (int i = 0;i < K;++i) {
		pq.emplace(0, P[i]);
		bst[P[i]] = sec[P[i]] = 0;
	}

	vector<bool> vis(N);

	while (pq.size()) {
		auto [len, x] = pq.top(); pq.pop();
		if (vis[x]) continue;
		vis[x] = true;
		for (auto [u, w] : edge[x]) {
			int curlen = min(inf, len + w), so = x;
			if (curlen < bst[u]) {
				assert(so != fr[u]);
				swap(curlen, bst[u]), swap(so, fr[u]);
			}
			if (curlen < sec[u]) {
				swap(curlen, sec[u]);
				pq.emplace(sec[u], u);
			}
		}
	}
	return sec[0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...