Submission #1221544

#TimeUsernameProblemLanguageResultExecution timeMemory
1221544nguyn경주 (Race) (IOI11_race)C++20
100 / 100
400 ms34108 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define F first #define S second #define pb push_back #define pii pair<int, int> const int maxN = 2e5 + 5; const int maxW = 1e6 + 5; const int inf = 1e9; int n, sz[maxN], k; vector<pii> g[maxN]; int edges[maxN][2], len[maxN]; int h[maxN], d[maxN]; int best[maxW]; int del[maxN]; int res = inf; void count_child(int u, int p) { sz[u] = 1; for (pii it : g[u]) { int v = it.F; int w = it.S; if (v == p || del[v]) continue; count_child(v, u); sz[u] += sz[v]; } } int find_centroid(int u, int p, int n) { for (pii it : g[u]) { int v = it.F; int w = it.S; if (v == p || del[v]) continue; if (sz[v] > n / 2) return find_centroid(v, u, n); } return u; } void update(int u, int p, bool sta) { if (sta == 0) { if (d[u] == k) res = min(res, h[u]); if (d[u] < k) { if (best[k - d[u]] != 0) res = min(res, best[k - d[u]] + h[u]); } } else { if (d[u] <= k) { if (best[d[u]] == 0) best[d[u]] = h[u]; else best[d[u]] = min(best[d[u]], h[u]); } } for (pii it : g[u]) { int v = it.F; int w = it.S; if (v == p || del[v]) continue; h[v] = h[u] + 1; d[v] = d[u] + w; update(v, u, sta); } } void delAns(int u, int p) { if (d[u] <= k) best[d[u]] = 0; for (pii it : g[u]) { int v = it.F; int w = it.S; if (v == p || del[v]) continue; delAns(v, u); } } void solve(int u) { count_child(u, 0); int n = sz[u]; int root = find_centroid(u, 0, n); del[root] = 1; for (pii it : g[root]) { int v = it.F; int w = it.S; if (del[v]) continue; h[v] = 1; d[v] = w; update(v, root, 0); update(v, root, 1); } d[root] = 0; delAns(root, 0); for (pii it : g[root]) { int v = it.F; int w = it.S; if (del[v]) continue; solve(v); } } int best_path(int N, int K, int H[][2], int L[]) { n = N; k = K; for (int i = 0; i < n - 1; i++) { H[i][0]++; H[i][1]++; g[H[i][0]].pb({H[i][1], L[i]}); g[H[i][1]].pb({H[i][0], L[i]}); } solve(1); if (res == inf) return -1; return res; } //signed main() { // ios_base::sync_with_stdio(0); // cin.tie(0); // cin >> n >> k; // for (int i = 0; i < n - 1; i++) { // cin >> edges[i][0] >> edges[i][1] >> len[i]; // } // cout << best_path(n, k, edges, len); //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...