Submission #742237

#TimeUsernameProblemLanguageResultExecution timeMemory
742237beabossRace (IOI11_race)C++14
9 / 100
37 ms25636 KiB
#include <bits/stdc++.h> using namespace std; #define s second #define f first #define pb push_back typedef long long ll; typedef pair<ll, ll> pii; typedef vector<pii> vpii; typedef vector<ll> vi; #define FOR(i, a, b) for (ll i = (a); i<b; i++) const ll MN = 3e5 + 10; vpii adj[MN]; ll d[MN]; // from root in highways ll d2[MN]; // from root in distance ll k; map<ll, ll> small[MN]; void dfs(ll cur = 0, ll dist = 0, ll dist2 = 0, ll p = -1) { // cout << cur << endl; d[cur]=dist; d2[cur]=dist2; small[cur][dist2]=dist; for (auto val: adj[cur]) { if (val.f != p) { dfs(val.f, dist + 1, dist2 + val.s, cur); } } } ll ans = 1e9; void solve(ll cur, ll p=-1) { for (auto val: adj[cur]) { if (val.f != p) { solve(val.f, cur); // cout << ' ' << val.f << ' ' << cur << d2[cur] << endl; // if (small[val.f].find(k + d2[cur]) != small[val.f].end()) { // // cout << " " << small[val.f][k + d2[cur]] << d[cur] << endl; // ans = min(ans, small[val.f][k + d2[cur]] - d[cur]); // // cout << ans << endl; // } if (small[val.f].size() > small[cur].size()) swap(small[val.f], small[cur]); // merge for (pii nx: small[val.f]) { if (small[cur].find(k + 2*d2[cur] - nx.f) != small[cur].end()) { // if (cur == 6) cout << small[cur][k + 2*d2[cur] - nx.f] << d[cur] << endl; ans = min(ans, small[cur][k + 2*d2[cur] - nx.f] + nx.s - 2*d[cur]); } } for (pii nx: small[val.f]) { if (small[cur].find(nx.f) == small[cur].end()) small[cur][nx.f]=nx.s; else small[cur][nx.f]=min(small[cur][nx.f], nx.s); } } } } int best_path(int N, int K, int H[][2], int L[]) { k = K; FOR(i, 0, N-1) { adj[H[i][0]].pb({H[i][1], L[i]}); } dfs(); solve(0); if (ans == 1e9) ans = -1; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...