Submission #162557

#TimeUsernameProblemLanguageResultExecution timeMemory
162557kostia244경주 (Race) (IOI11_race)C++14
100 / 100
2458 ms73196 KiB
#define _GLIBCXX_DEBUG #include "race.h" #include<bits/stdc++.h> #define pb push_back #define all(x) x.begin(), x.end() using namespace std; using vi = vector<int>; using vvi = vector<vi>; using pi = pair<int, int>; int table[1000100]; vi used; int get(int x) { if(x<0||x>1000100) return table[1000091]; return table[x]; } void mset(int x, int y) { if(x<0||x>1000100) return; table[x] = min(table[x], y); used.pb(x); } void clear() { for(auto i : used) table[i] = table[1000091]; table[0] = 0; used.clear(); } int n, k, ans = 10000001; vector<vector<pi>> g; vi sz, maxch, comp; bitset<300300> is_centroid; void sizes(int v, int p) { sz[v]=1, maxch[v]=0; comp.pb(v); for(auto ii : g[v]) { int i = ii.first; if(!is_centroid.test(i)&&i!=p) sizes(i, v), sz[v] += sz[i], maxch[v] = max(maxch[v], sz[i]); } } void dfsg(int v, int p, int d = 0, int vl = 0) { if(vl>k) return; ans = min(ans, d+get(k-vl)); for(auto ii : g[v]) { int i = ii.first, c = ii.second; if(is_centroid.test(i)||i==p) continue; dfsg(i, v, d+1, vl+c); } } void dfss(int v, int p, int d = 0, int vl = 0) { if(vl>k) return; mset(vl, d); for(auto ii : g[v]) { int i = ii.first, c = ii.second; if(is_centroid.test(i)||i==p) continue; dfss(i, v, d+1, vl+c); } } void decompose(int v) { comp.clear(); sizes(v, v); int c = comp[0]; for(auto i : comp) { maxch[i] = max(maxch[i], (int)comp.size()-sz[i]); if(maxch[i]<maxch[c])c=i; } for(auto ii : g[c]) { int i = ii.first, cst = ii.second; if(is_centroid.test(i)) continue; dfsg(i, c, 1, cst); dfss(i, c, 1, cst); } clear(); is_centroid.set(c); for(auto ii : g[c]) { int i = ii.first; if(!is_centroid.test(i)) decompose(i); } } int best_path(int N, int K, int H[][2], int L[]) { memset(table, 0x3f, sizeof table), table[0] = 0; n=N,k=K; g.resize(n); sz.resize(n); maxch.resize(n); for(int i = 0; i+1 < n; i++) { g[H[i][0]].pb({H[i][1], L[i]}); g[H[i][1]].pb({H[i][0], L[i]}); } decompose(0); if(ans>n)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...