Submission #1269602

#TimeUsernameProblemLanguageResultExecution timeMemory
1269602KawakiMeidoRace (IOI11_race)C++20
100 / 100
633 ms36480 KiB
/*Author: KawakiMeido*/ #include <bits/stdc++.h> #include "race.h" #define pb push_back #define endl "\n" #define ll long long #define all(x) (x).begin(),(x).end() #define pii pair<int,int> #define fi first #define se second #define TEXT "" using namespace std; /*Constants*/ const int N = 2e5+10; const int INF = 1e9+7; const long long LLINF = 1e18+3; /*Global Variables*/ int n,k; vector<pii> adj[N]; int sz[N]; bool vis[N]; int ans; map<int,int> mp; int findSize(int u, int p=0){ sz[u] = 1; for (auto [v,w]:adj[u]){ if (vis[v] || v==p) continue; sz[u]+=findSize(v,u); } return sz[u]; } int findCentroid(int u, int n, int p=0){ for (auto [v,w]:adj[u]){ if (vis[v] || v==p) continue; if (sz[v] > n/2) return findCentroid(v,n,u); } return u; } void dfsCalc(int u, int dist, int p=0, int depth = 1){ if (k-dist>=0 && mp.count(k-dist)){ ans = min(ans,depth + mp[k-dist]); } // cout << u << " " << ans << endl; for (auto [v,w]:adj[u]){ if (vis[v] || v==p) continue; dfsCalc(v,dist+w,u,depth+1); } } void dfsIns(int u, int dist, int p=0, int depth = 1){ if (!mp.count(dist)) mp[dist] = depth; else mp[dist] = min(mp[dist],depth); for (auto [v,w]:adj[u]){ if (vis[v] || v==p) continue; dfsIns(v,dist+w,u,depth+1); } } void buildCentroid(int u, int p=0){ findSize(u); int c = findCentroid(u,sz[u]); // cout << "centroid: " << c << endl; vis[c] = true; mp[0] = 0; for (auto [v,w]:adj[c]){ if (vis[v]) continue; dfsCalc(v,w); dfsIns(v,w); } // cout << ans << endl; mp.clear(); for (auto [v,w]:adj[c]){ if (vis[v]) continue; buildCentroid(v,c); } } signed best_path(int _n, int _k, int h[][2], int l[]){ n = _n; k = _k; for (int i=0; i<n-1; i++){ int u,v; u = h[i][0]; v = h[i][1]; ++u; ++v; // tie(u,v) = h[i]; adj[u].push_back({v,l[i]}); adj[v].push_back({u,l[i]}); } ans = n+1; buildCentroid(1); if (ans == n+1) return -1; return ans; } //int _n, _k; //int _h[N][2]; //int _l[N]; //void solve(){ // cin >> _n >> _k; // for (int i=0; i<_n-1; i++){ // int u,v,w; // cin >> u >> v >> w; // _h[i][0] = u; // _h[i][1] = v; // _l[i] = w; // } // cout << best_path(_n,_k,_h, _l); //} // //signed main(){ // cin.tie(0) -> sync_with_stdio(0); // if (fopen(TEXT".inp","r")){ // freopen(TEXT".inp","r",stdin); // freopen(TEXT".out","w",stdout); // } // // int testCount = 1; //// cin >> testCount; // while (testCount--){ // solve(); // } // // return 0; //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...