답안 #422396

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
422396 2021-06-10T05:41:50 Z milleniumEeee 공장들 (JOI14_factories) C++11
0 / 100
8000 ms 99424 KB
#include "factories.h"
#ifndef EVAL  
#include "grader.cpp"
#endif

#include <bits/stdc++.h>
#define fr first
#define sc second
#define pii pair<int, int>
#define pb push_back
#define szof(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define ll long long

using namespace std;

const ll INF = 1e18;
const int MAXN = (int)5e5 + 5;
const int MAXQ = (int)1e5 + 5;
const int L = 20;

vector <pii> g[MAXN];
int n;

int pr[MAXN][L + 1];
ll d[MAXN];
int tin[MAXN], tout[MAXN], tiktak;

void precalc(int v, int par, ll len) {
	tin[v] = ++tiktak;
	pr[v][0] = par;
	d[v] = len;
	for (int lv = 1; lv <= L; lv++) {
		pr[v][lv] = pr[pr[v][lv - 1]][lv - 1];
	}
	for (auto [to, dist] : g[v]) {
		if (to == par) {
			continue;
		}
		precalc(to, v, len + dist);
	}
	tout[v] = tiktak;
}

bool father(int a, int b) {
	return tin[a] <= tin[b] && tout[b] <= tout[a];
}

int get_lca(int a, int b) {
	if (father(a, b)) {
		return a;
	}
	if (father(b, a)) {
		return b;
	}
	for (int lv = L; lv >= 0; lv--) {
		if (!father(pr[a][lv], b)) {
			a = pr[a][lv];
		}
	}
	return pr[a][0];
}

ll get_dist(int a, int b) {
	return d[a] + d[b] - (2ll * d[get_lca(a, b)]);
}

void Init(int N, int A[], int B[], int D[]) {
	n = N;
	for (int i = 0; i < n; i++) {
		int u = A[i];
		int v = B[i];
		int dist = D[i];
		g[u].pb({v, dist});
		g[v].pb({u, dist});
	}
	precalc(0, 0, 0);
}

ll dist[3][MAXN];

void dijkstra(vector <int> start, ll *min_dist) {
	fill(min_dist, min_dist + n, -1);
	priority_queue <pii> pq;
	for (int el : start) {
		min_dist[el] = 0;
		pq.push({0, el});
	}
	while (!pq.empty()) {
		ll cost = -pq.top().fr;
		int v = pq.top().sc;
		pq.pop();
		if (cost > min_dist[v]) {
			continue;
		}
		for (auto [to, dist] : g[v]) {
			if (min_dist[to] == -1 || min_dist[to] > cost + dist) {
				min_dist[to] = cost + dist;
				pq.push({-min_dist[to], to});
			}
		}
	}
}

ll Query(int S, int X[], int T, int Y[]) {
	vector <int> start_s, start_t;
	for (int i = 0; i < S; i++) {
		start_s.pb(X[i]);
	}
	for (int i = 0; i < T; i++) {
		start_t.pb(Y[i]);
	}
	dijkstra(start_s, dist[1]);
	dijkstra(start_t, dist[2]);
	ll ans = INF;
	for (int i = 0; i < n; i++) {
		ans = min(ans, dist[1][i] + dist[2][i]);
	}	
	return ans;
}

Compilation message

factories.cpp: In function 'void precalc(int, int, long long int)':
factories.cpp:36:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   36 |  for (auto [to, dist] : g[v]) {
      |            ^
factories.cpp: In function 'void dijkstra(std::vector<int>, long long int*)':
factories.cpp:96:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   96 |   for (auto [to, dist] : g[v]) {
      |             ^
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 12428 KB Output is correct
2 Correct 6237 ms 20912 KB Output is correct
3 Incorrect 6383 ms 20968 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 12340 KB Output is correct
2 Execution timed out 8095 ms 99424 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 12428 KB Output is correct
2 Correct 6237 ms 20912 KB Output is correct
3 Incorrect 6383 ms 20968 KB Output isn't correct
4 Halted 0 ms 0 KB -