Submission #216556

#TimeUsernameProblemLanguageResultExecution timeMemory
216556LittleFlowers__Race (IOI11_race)C++14
100 / 100
488 ms33752 KiB
#include <bits/stdc++.h> using namespace std; #define in ({int x=0;int c=getchar(),n=0;for(;!isdigit(c);c=getchar()) n=(c=='-');for(;isdigit(c);c=getchar()) x=x*10+c-'0';n?-x:x;}) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int rnd(int l,int r){return l+rng()%(r-l+1);} #define fasty ios_base::sync_with_stdio(0),cin.tie(0); #define forinc(a,b,c) for(int a=b,_c=c;a<=_c;++a) #define fordec(a,b,c) for(int a=b,_c=c;a>=_c;--a) #define forv(a,b) for(auto&a:b) #define fi first #define se second #define pb push_back #define ii pair<int,int> #define mt make_tuple #define all(a) a.begin(),a.end() #define reset(f, x) memset(f, x, sizeof(f)) #define bit(x,i) ((x>>(i-1))&1) #define on(x,i) (x|(1ll<<(i-1))) #define off(x,i) (x&~(1<<(i-1))) #define gg exit(0); //#define unx 1 #ifndef unx #include "race.h" #endif const int N=200010; int n,cnt,k,ret; int sz[N],dd[N],f[N*5]; vector<ii> val; vector<ii> ad[N]; void dfs1(int u,int p=-1){ sz[u]=1; cnt++; forv(v,ad[u]) if(!dd[v.fi] && v.fi!=p) dfs1(v.fi,u), sz[u]+=sz[v.fi]; } int ftr(int u,int p=-1){ forv(v,ad[u]) if(!dd[v.fi] && v.fi!=p && sz[v.fi]>cnt/2) return ftr(v.fi,u); return u; } void dfs2(int u,int p,int c,int d){ if(c>k) return; val.push_back({c,d}); forv(v,ad[u]) if(!dd[v.fi] && v.fi!=p && v.se+c<=k) dfs2(v.fi,u,c+v.se,d+1); } void ctr(int u){ cnt=0; dfs1(u); dd[u=ftr(u)]=1; f[0]=0; vector<int> reval; forv(v,ad[u]) if(!dd[v.fi]){ dfs2(v.fi,u,v.se,1); forv(i,val) if(f[k-i.fi]>-1) ret=min(ret,i.se+f[k-i.fi]); forv(i,val) f[i.fi]=f[i.fi]<0 ? i.se : min(f[i.fi],i.se), reval.push_back(i.fi); val.clear(); } forv(i,reval) f[i]=-1; forv(v,ad[u]) if(!dd[v.fi]) ctr(v.fi); } int best_path(int n,int _k,int h[][2],int l[]){ k=_k; ret=n; forinc(i,0,n-2){ int u=h[i][0], v=h[i][1], w=l[i]; ad[u].push_back({v,w}); ad[v].push_back({u,w}); } reset(f,-1); ctr(0); return ret<n ? ret : -1; } #ifdef unx main(){ #define task "RACE" freopen(task".inp","r",stdin); //freopen(task".out","w",stdout); int n, k; cin>>n>>k; int H[100][2]; int L[100]; forinc(i,2,n){ cin>>H[i-2][0]>>H[i-2][1]; } forinc(i,2,n){ cin>>L[i-2]; } cout<<best_path(n,k,H,L); } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...