Submission #49759

#TimeUsernameProblemLanguageResultExecution timeMemory
49759gs13105Race (IOI11_race)C++17
100 / 100
1625 ms39316 KiB
#include <cstdio> #include <cstdlib> #include <cstring> #include <cassert> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <list> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <tuple> #include <iterator> using namespace std; const int MAXN = 200000; struct edg { int x, w; }; vector<edg> arr[MAXN + 10]; bool chk[MAXN + 10]; int cnt[MAXN + 10]; int k; int sz; void f(int x, int p) { cnt[x] = 1; for(edg &e : arr[x]) { if(chk[e.x] || e.x == p) continue; f(e.x, x); cnt[x] += cnt[e.x]; } } int g(int x, int p) { bool u = 1; int sum = 1; for(edg &e : arr[x]) { if(chk[e.x] || e.x == p) continue; int t = g(e.x, x); if(t != -1) return t; if(cnt[e.x] > sz / 2) u = 0; sum += cnt[e.x]; } if(!u || sz - sum > sz / 2) return -1; return x; } map<int, int> mem; vector<pair<int, int>> add; void h(int x, int p, int w, int l) { add.push_back({ w, l }); for(edg &e : arr[x]) { if(chk[e.x] || e.x == p) continue; if(w + e.w <= k) h(e.x, x, w + e.w, l + 1); } } int solve(int a) { f(a, a); sz = cnt[a]; int c = g(a, a); assert(c != -1); mem.clear(); mem[0] = 0; int res = -1; for(edg &e : arr[c]) { if(chk[e.x]) continue; add.clear(); h(e.x, c, e.w, 1); for(auto &e : add) { auto it = mem.find(k - e.first); if(it != mem.end()) { int t = it->second + e.second; if(res == -1 || t < res) res = t; } } for(auto &e : add) { auto it = mem.find(e.first); if(it != mem.end()) it->second = min(it->second, e.second); else mem[e.first] = e.second; } } chk[c] = 1; for(edg &e : arr[c]) { if(chk[e.x]) continue; int t = solve(e.x); if(res == -1 || t != -1 && t < res) res = t; } return res; } int best_path(int N, int K, int H[][2], int L[]) { for(int i = 0; i < N - 1; i++) { arr[H[i][0]].push_back({ H[i][1], L[i] }); arr[H[i][1]].push_back({ H[i][0], L[i] }); } k = K; return solve(0); }

Compilation message (stderr)

race.cpp: In function 'int solve(int)':
race.cpp:130:33: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         if(res == -1 || t != -1 && t < res)
                         ~~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...