Submission #1149044

#TimeUsernameProblemLanguageResultExecution timeMemory
1149044sasdeRace (IOI11_race)C++20
0 / 100
4 ms4928 KiB
#include<bits/stdc++.h> #define str string #define task "strdel" #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii,ii> #define se second #define fi first #define ffi fi.fi #define sfi se.fi #define sse se.se #define fse fi.se #define lt(i, c, d) for(int i = c; i <= d; ++i) #define fl(i, c, d) for(int i = d; i >= c; --i) #define pb push_back #define emb emplace_back #define emf emplace_front #define em emplace using namespace std; const int N=1e6+5,lg=20,mod=1e9+7; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int Rand(int u,int v){ return u+rd()%(v-u+1); } int n,k,sz[200005],dp[N],ans=1e9; vector<ii>a[200005]; bool check[200005]; void dfs(int u,int cha){ sz[u]=1; for(ii v:a[u]){ if(v.fi==cha||check[v.fi])continue; dfs(v.fi,u); sz[u]+=sz[v.fi]; } } int fin(int u,int cha,int n){ for(ii v:a[u]){ if(v.fi!=cha&&!check[v.fi]&&sz[v.fi]>n/2)return fin(v.fi,u,n); } return u; } void add(int u,int cha,int sum,int canh){ // cout <<u<<" "<<canh<<" "<<sum<<" "<<dp[sum]<<'\n'; ans=min(ans,canh+dp[k-sum]); for(ii v:a[u]){ if(v.fi==cha||check[v.fi]||sum-v.se<0)continue; add(v.fi,u,sum-v.se,canh+1); } } stack<int>s; void them(int u,int cha,int sum,int canh){ dp[sum]=min(dp[sum],canh); s.push(sum); for(ii v:a[u]){ if(v.fi==cha||check[v.fi]||sum-v.se<0)continue; them(v.fi,u,sum-v.se,canh+1); } } void buildcen(int u,int cha){ dfs(u,-1); int g=fin(u,-1,sz[u]); // cout <<g<<'\n'; // for(int i=1;i<=n;++i)cout <<sz[i]<<" "; check[g]=true; for(ii v:a[g]){ if(v.fi==cha||check[v.fi]||k-v.se<0)continue; add(v.fi,g,k-v.se,1); them(v.fi,g,k-v.se,1); } while(!s.empty()){ // cout <<g<<" "<<s.top()<<'\n'; dp[s.top()]=1e9; s.pop(); } for(ii v:a[g]){ if(v.fi==cha||check[v.fi])continue; buildcen(v.fi,g); } } int best_path(int n,int k,int b[][2],int w[]){ // for(int i=1;i<n;++i)cin >> b[i][1] >> b[i][0]; // for(int i=1;i<n;++i)cin >> w[i]; for(int i=1;i<n;++i){ int u=b[i][1]+1,v=b[i][0]+1; // cout <<u<<" "<<v<<" "<<w<<'\n'; a[u].emb(v,w[i]); a[v].emb(u,w[i]); } for(int i=1;i<=k;++i)dp[i]=1e9; buildcen(1,-1); return (ans==1e9?-1: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...