Submission #483505

#TimeUsernameProblemLanguageResultExecution timeMemory
483505MisukiRace (IOI11_race)C++17
43 / 100
3058 ms29960 KiB
#include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int SIZE = 200000; int n, k, ans = INT_MAX; int sub[SIZE]; vector<pii> G[SIZE]; bitset<SIZE> vis; int calc(int V, int P) { sub[V] = 1; for(pii X : G[V]) if (!vis[X.first] and X.first != P) sub[V] += calc(X.first, V); return sub[V]; } int centroid(int V, int P, int sz) { for(pii X : G[V]) if (!vis[X.first] and X.first != P and sub[X.first] > sz / 2) return centroid(X.first, V, sz); return V; } void calc2(int V, int P, int len, int cost, map<int, int> &m) { if (cost > k) return; if (m.find(cost) == m.end()) m[cost] = len; else m[cost] = min(m[cost], len); for(pii X : G[V]) if (!vis[X.first] and X.first != P) calc2(X.first, V, len + 1, cost + X.second, m); } void centroidDecomposite(int V) { calc(V, -1); int C = centroid(V, -1, sub[V]); map<int, int> sum; sum[0] = 0; for(pii X : G[C]) { map<int, int> tmp; calc2(X.first, C, 1, X.second, tmp); for(pii Y : tmp) { int cost = Y.first, len = Y.second; if (sum.find(k - cost) == sum.end()) continue; ans = min(ans, len + sum[k - cost]); } for(pii Y : tmp) { if (sum.find(Y.first) == sum.end()) sum[Y.first] = Y.second; else sum[Y.first] = min(sum[Y.first], Y.second); } } vis[C] = true; for(pii X : G[C]) if (!vis[X.first]) centroidDecomposite(X.first); } int best_path(int N, int K, int H[][2], int L[]) { n = N, k = K; for(int i = 0; i < N - 1; i++) { G[H[i][0]].emplace_back(make_pair(H[i][1], L[i])); G[H[i][1]].emplace_back(make_pair(H[i][0], L[i])); } centroidDecomposite(0); return ans == INT_MAX ? -1 : ans; } /* int A[SIZE - 1][2]; int B[SIZE - 1]; int main() { int n, k; cin >> n >> k; for(int i = 0; i < n - 1; i++) cin >> A[i][0] >> A[i][1]; for(int i = 0; i < n - 1; i++) cin >> B[i]; cout << best_path(n, k, A, B) << '\n'; return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...