Submission #302432

#TimeUsernameProblemLanguageResultExecution timeMemory
302432HemimorRace (IOI11_race)C++14
0 / 100
4 ms4352 KiB
#include "race.h" #include <algorithm> #include <vector> using namespace std; typedef long long ll; typedef pair<int,int> P; typedef vector<int> vi; typedef vector<P> vp; typedef vector<vp> vvp; const int inf=1<<30,MAX=1000001; int res=inf,c[MAX]; ll m; vi s,vis; vvp g; vp a; int Cdfs(int v,int p){ s[v]=1; for(auto i:g[v]){ int u=i.first; if(!vis[u]&&u!=p) s[v]+=Cdfs(u,v); } return s[v]; } P Cdfs1(int v,int p,int S){ P q={inf,0}; int M=0,S_=S-1; for(auto i:g[v]){ int u=i.first; if(!vis[u]&&u!=p){ q=min(q,Cdfs1(u,v,S)); M=max(M,s[u]); S_-=s[u]; } } return min(q,{max(M,S_),v}); } int Cent(int v){ Cdfs(v,-1); return Cdfs1(v,-1,s[v]).second; } void dfs(int v,int par,int t,int len,bool B=true){ if(len>=res||t>m) return; if(t<=m&&B) a.push_back({t,len}); if(t==m) res=min(res,len); for(auto p:g[v]){ int u=p.first; if(!vis[u]&&u!=par) dfs(u,v,p.second+t,len+1,p.second!=0); } } void DFS(int v,int par,int t,int len,int tp){ if(len>=res||t>m) return; if(t==m) res=min(res,len); if(tp==0&&t<m) res=min(res,c[m-t]+len); if(tp==1) c[t]=min(c[t],len); if(tp==2) c[t]=inf; for(auto p:g[v]){ int u=p.first; if(!vis[u]&&u!=par) dfs(u,v,p.second+t,len+1,tp); } } void Rec(int v){ v=Cent(v); vis[v]++; vvp b; for(auto p:g[v]){ DFS(p.first,-1,p.second,1,0); DFS(p.first,-1,p.second,1,1); DFS(p.first,-1,p.second,1,2); } for(auto p:g[v]){ int u=p.first; if(!vis[u]) Rec(u); } } int best_path(int N, int K, int H[][2], int L[]){ m=K; s=vis=vi(N); g=vvp(N); fill(c,c+MAX,inf); for(int i=0;i<N-1;i++){ int u=H[i][0],v=H[i][1]; g[u].push_back({v,L[i]}); g[v].push_back({u,L[i]}); } Rec(0); if(res==inf) res=-1; return 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...