Submission #674289

#TimeUsernameProblemLanguageResultExecution timeMemory
674289lamRace (IOI11_race)C++14
43 / 100
925 ms262144 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> ii; #define ff first #define ss second const int maxn = 2e5 + 10; map<long long,int> mp[maxn]; int n; long long k; vector <ii> adj[maxn]; int s[maxn],dau[maxn]; int ans = 1e9; int get_sz(int x, int p) { s[x]=1; for (ii i:adj[x]) if (i.ff!=p&&!dau[i.ff]) s[x]+=get_sz(i.ff,x); return s[x]; } int find_centroid(int x, int p, int sz) { for (ii i:adj[x]) if (i.ff!=p&&!dau[i.ff]&&s[i.ff]*2>sz) return find_centroid(i.ff,x,sz); return x; } void dfs(int root, int x, int p, long long val, int depth) { if (val<=k&&mp[root][k-val]) ans=min(ans,depth+mp[root][k-val]); if (val==k) ans=min(ans,depth); for (ii i:adj[x]) if (i.ff!=p&&!dau[i.ff]) dfs(root,i.ff,x,1LL*val+i.ss,depth+1); } void dfs2(int root, int x, int p, long long val, int depth) { if (val<=k) { if (!mp[root][val]) mp[root][val] = depth; else mp[root][val]=min(mp[root][val],depth); } for (ii i:adj[x]) if (i.ff!=p&&!dau[i.ff]) dfs2(root,i.ff,x,1LL*val+i.ss,depth+1); } void decompose(int x) { x=find_centroid(x,x,get_sz(x,x)); dau[x]=1; for (ii i:adj[x]) if (!dau[i.ff]) { dfs(x,i.ff,x,1LL*i.ss,1); dfs2(x,i.ff,x,1LL*i.ss,1); } for (ii i:adj[x]) if (!dau[i.ff]) decompose(i.ff); } ii e[maxn]; int best_path(int N, int K, int H[][2], int L[]) { n=N; k=K; for (int i=0; i<n-1; i++) { e[i].ff=H[i][0]; e[i].ss=H[i][1]; } for (int i=0; i<n-1; i++) { int w=L[i]; int u=e[i].ff; int v=e[i].ss; u++; v++; adj[u].push_back({v,w}); adj[v].push_back({u,w}); } decompose(1); if (ans==1e9) 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...