# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
173226 | aer0park | Race (IOI11_race) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
typedef pair<pi,ll> pii;
ll anw=1e16,n,k,cen,del[200005],sz[200005];
pi pth[200005];
map<pi,ll> l;
vector<ll> g[200005];
vector<pii> ar;
void gtsz(ll a,ll p)
{
sz[a]=1;
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
gtsz(g[a][i],a),sz[a]+=sz[g[a][i]];
}
void fdcen(ll a,ll p,ll mxsz)
{
ll mx=0;
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&sz[g[a][i]]>mxsz/2&&!del[g[a][i]])
fdcen(g[a][i],a,mxsz);
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
mx=max(mx,sz[g[a][i]]);
if(mx<=mxsz/2) cen=a;
}
void gtpth(ll a,ll p)
{
if(p==-1) pth[a]={0,0};
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
{
pth[g[a][i]].f=pth[a].f+l[{a,g[a][i]}];
pth[g[a][i]].s=pth[a].s+1;
gtpth(g[a][i],a);
}
}
void push(ll a,ll p,ll id)
{
ar.push_back({pth[a],id});
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
push(g[a][i],a,id);
}
void getanw(ll a,ll p)
{
gtsz(a,p),fdcen(a,p,sz[a]),gtpth(cen,-1);
a=cen,del[a]=1;
ar.clear();
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
push(g[a][i],a,i);
ar.push_back({pth[a],g[a].size()});
sort(ar.begin(),ar.end());
for(int i=0;i<ar.size();i++)
{
auto it=lower_bound(ar.begin(),ar.end(),pii(pi(k-ar[i].f.f,-1),-1));
while(1)
{
if(it->f.f!=k-ar[i].f.f) break;
if(it->s!=ar[i].s)
{
anw=min(anw,ar[i].f.s+it->f.s);
break;
}
it++;
}
}
for(int i=0;i<g[a].size();i++)
if(g[a][i]!=p&&!del[g[a][i]])
getanw(g[a][i],a);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>k;
for(int i=1;i<n;i++)
{
ll a,b,c;cin>>a>>b>>c;
g[a].push_back(b),g[b].push_back(a);
l[{a,b}]=c,l[{b,a}]=c;
}
getanw(0,-1);
if(anw==1e16) cout<<-1;
else cout<<anw;
return 0;
}