Submission #699267

#TimeUsernameProblemLanguageResultExecution timeMemory
699267gagik_2007Race (IOI11_race)C++17
100 / 100
1662 ms74316 KiB
#include "race.h" #include <iostream> #include <algorithm> #include <string> #include <vector> #include <cmath> #include <chrono> #include <ctime> #include <set> #include <map> #include <stack> #include <queue> #include <deque> #include <limits> #include <iomanip> #include <unordered_set> #include <unordered_map> #include <fstream> #include <functional> #include <random> #include <cassert> using namespace std; typedef long long ll; typedef long double ld; #define ff first #define ss second ll ttt; const ll INF = 1e18; const ll MOD = 1e9 + 7; const ll maxN = 200507; const ll LG = 18; ll n, m, k; set<pair<ll, ll>>g[maxN]; ll sz[maxN]; ll ans = INF; map<ll, ll>cnt; void dfs(ll v, ll par = -1) { sz[v] = 1; for (auto to : g[v]) { if (to.ff != par) { dfs(to.ff, v); sz[v] += sz[to.ff]; } } } ll centroid(ll v, ll size, ll par = -1) { for (auto to : g[v]) { if (to.ff != par && sz[to.ff] > size / 2) { return centroid(to.ff, size, v); } } return v; } void upd_ans(ll v, ll dpt, ll size, ll cur, ll par = -1) { if (dpt <= k) { //cout << dpt << " "; if (k == dpt) { ans = min(ans, cur); //cout << "E ARECI HETO?\n"; } else { ans = min(ans, (cnt[k - dpt] == 0 ? INF : cnt[k - dpt]) + cur); } } for (auto to : g[v]) { if (to.ff != par) { upd_ans(to.ff, dpt + to.ss, size, cur + 1, v); } } } void upd_cnt(ll v, ll dpt, ll cur, ll par = -1) { if (dpt != 0) { //cout << dpt << " "; if (cnt[dpt] == 0) { cnt[dpt] = cur; } else { cnt[dpt] = min(cnt[dpt], cur); } //cout << v << ": " << dpt << ": " << cnt[dpt] << endl; } for (auto to : g[v]) { if (to.ff != par) { upd_cnt(to.ff, dpt + to.ss, cur + 1, v); } } } void mshak(ll c, ll size) { //cout << "MSHAKUM ENQ: " << c << endl; cnt.clear(); for (auto to : g[c]) { upd_ans(to.ff, to.ss, size, 1, c); upd_cnt(to.ff, to.ss, 1, c); } /*for (auto x : cnt) { if(x.ff==k)cout << x.ff << ": " << x.ss << endl; }*/ } void cntr_dec(ll v, ll par = -1) { dfs(v, par); ll c = centroid(v, sz[v], par); mshak(c, sz[v]); set<pair<ll, ll>>g_copy(g[c]); for (auto to : g_copy) { g[c].erase(to); g[to.ff].erase({ c,to.ss }); cntr_dec(to.ff, c); } } int best_path(int NN, int K, int H[][2], int L[]) { n = NN; k = K; for (int i = 0; i < n - 1; i++) { g[H[i][0]].insert({ H[i][1],L[i] }); g[H[i][1]].insert({ H[i][0],L[i] }); } cntr_dec(1); return (ans == INF ? -1 : ans); } /// ---- - -------- ------ -------- -- - - - /// Just a reminder. Ubuntu password is I O I /// ---- - -------- ------ -------- -- - - -
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...