Submission #1136295

#TimeUsernameProblemLanguageResultExecution timeMemory
1136295Marko2604Race (IOI11_race)C++20
100 / 100
1923 ms70984 KiB
#include<bits/stdc++.h> #include "race.h" #define ll long long #define MAXN 200007 using namespace std; vector<vector<pair<int,ll>>>T(MAXN); bool used[MAXN]; int subtree[MAXN]; void subtreedfs(int node, int p=-1) { subtree[node]=1; for(auto i:T[node]) if(!used[i.first] && i.first!=p) { subtreedfs(i.first,node); subtree[node]+=subtree[i.first]; } } int getCentroid(int node, int subsz, int p=-1) { for(auto i:T[node]) if(i.first!=p && !used[i.first] && subtree[i.first]*2>subsz) return getCentroid(i.first,subsz,node); return node; } ll depth[MAXN]; map<ll,int>m; map<ll,bool>seen; int k, ans=INT_MAX; void dfs1(int node, int p, ll d, int d1) { if(seen[k-d]) ans=min(ans,d1+m[k-d]); for(auto i:T[node]) if(i.first!=p && !used[i.first]) dfs1(i.first,node,d+i.second,d1+1); } void dfs2(int node, int p, ll d, int d1) { depth[node]=d; if(seen[d]) m[d]=min(m[d],d1); else { m[d]=d1; seen[d]=true; } for(auto i:T[node]) if(i.first!=p && !used[i.first]) dfs2(i.first,node,d+i.second,d1+1); } void cenDec(int node) { subtreedfs(node); int c=getCentroid(node,subtree[node]); used[c]=true; seen[0]=true; m[0]=0; for(auto i:T[c]) if(!used[i.first]) { dfs1(i.first,c,i.second,1); dfs2(i.first,c,i.second,1); } m.clear(); seen.clear(); for(auto i:T[c]) if(!used[i.first]) cenDec(i.first); } int best_path(int N, int K, int H[][2], int L[]) { k=K; for(int i=0;i<N-1;i++) { T[H[i][0]].emplace_back(H[i][1],L[i]); T[H[i][1]].emplace_back(H[i][0],L[i]); } cenDec(1); if(ans==INT_MAX) return -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...