Submission #434650

#TimeUsernameProblemLanguageResultExecution timeMemory
434650hhhhauraRace (IOI11_race)C++14
100 / 100
1717 ms46684 KiB
#define wiwihorz #include "race.h" #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #pragma loop-opt(on) #define rep(i, a, b) for(int i = a; i <= b; i ++) #define rrep(i, a, b) for(int i = b; i >= a; i--) #define all(x) x.begin(), x.end() #define ceil(a, b) ((a + b - 1) / (b)) #define INF 1000000000000000000 #define MOD 1000000007 #define eps (1e-9) using namespace std; #define ll long long int #define lld long double #define pii pair<int, int> #define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()) #ifdef wiwihorz #define print(a...) cerr << "line " << __LINE__ << ": ", kout("[" + string(#a) + "] = ", a) void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;} void kout() { cerr << endl; } template<class T1, class ... T2> void kout(T1 a, T2 ... e) { cerr << a << " ", kout(e...); } #else #define print(...) 0 #define vprint(...) 0 #endif int n, k, ii, cc; ll ans; vector<vector<int>> mp; vector<int> pre, es, cost, vis; vector<int> sz, mx, d1, d2; map<ll, ll> cnt; void get_sz(int x, int par) { sz[x] = 1, mx[x] = 0; for(auto i : mp[x]) { int to = es[i] ^ x; cc ++; if(par == i || vis[to]) continue; get_sz(to, i); sz[x] += sz[to]; mx[x] = max(mx[x], sz[to]); } } int get_cen(int x, int par, int tot) { int best = x; for(auto i : mp[x]) { int to = es[i] ^ x; cc++; if(i == par || vis[to]) continue; int cur = get_cen(to, i, tot); if(max(mx[cur], tot - sz[cur]) < max(mx[best], tot - sz[best])) best = cur; } return best; } void dfs(int x, int par, int dd1 = 0, int dd2 = 0) { d1[x] = dd1, d2[x] = dd2; pre[ii ++] = x; for(auto i : mp[x]) { int to = es[i] ^ x; cc++; if(i == par || vis[to]) continue; dfs(to, i, dd1 + 1, dd2 + cost[i]); } } void solve(int x, int par) { get_sz(x, -1); int cen = get_cen(x, -1, sz[x]); vis[cen] = 1, cnt.clear(); cnt[0] = 0; for(auto i : mp[cen]) { int to = es[i] ^ cen; cc++; if(vis[to]) continue; ii = 0, dfs(to, -1, 1, cost[i]); rep(j, 0, ii - 1) { int cur = pre[j], v = k - d2[cur]; if(cnt.find(v) != cnt.end()) ans = min(ans, d1[cur] + cnt[v]); } rep(j, 0, ii - 1) { int cur = pre[j], v = d2[cur]; if(cnt.find(v) == cnt.end()) cnt[v] = d1[cur]; else cnt[v] = min(cnt[v], (ll)d1[cur]); } } for(auto i : mp[cen]) { int to = es[i] ^ cen; cc++; if(vis[to]) continue; solve(to, i); } return; } int best_path(int N, int K, int H[][2], int L[]) { k = K, n = N, ii = 0; ans = INF, cc = 0; mp.assign(n + 1, vector<int>()); pre.assign(n + 1, 0); vis.assign(n + 1, 0); sz.assign(n + 1, 0); mx.assign(n + 1, 0); assert(cc <= 1e9); d1.assign(n + 1, 0); d2.assign(n + 1, 0); rep(i, 0, n - 2) { int a = H[i][0] + 1, b = H[i][1] + 1; mp[a].push_back(es.size()); mp[b].push_back(es.size()); es.push_back(a ^ b); cost.push_back(L[i]); } solve(1, -1); return (ans == INF ? -1 : ans); }

Compilation message (stderr)

race.cpp:5: warning: ignoring '#pragma loop ' [-Wunknown-pragmas]
    5 | #pragma loop-opt(on)
      | 
race.cpp:25:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   25 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |             ^~~~
race.cpp:25:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   25 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |                     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...