rt,如题,按第一篇题解思路写的,50pts TLE,评测记录。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define flush() fwrite(obuf,p3-obuf,1,stdout)
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(flush(),p3=obuf,*p3++=x)
template<typename T> inline void read(T&);
template<typename T> inline void write(T);
template<typename... Args> inline void read(Args& ...);
template<typename... Args> inline void write(Args ...);
const int N=200005;
int n,ans=N,K;
struct edge{
int to,val;
edge():to(0),val(0){}
edge(int To,int Val):to(To),val(Val){}
};
vector<edge> G[N];
int root,max_part,all;
bool alive[N],vis[N];
int dis[N],dep[N],siz[N];
int a[N];
int cnt[1000005];
void find(const int& u){
int now=0;
siz[u]=1;
for(edge e:G[u])
if(!vis[e.to]&&!alive[e.to])
vis[e.to]=1,find(e.to),siz[u]+=siz[e.to],now=max(now,siz[e.to]);
now=max(now,all-siz[u]);
if(now<=max_part) root=u,max_part=now;
}
void calc(const int& u,const int& rt){
if(dis[u]>K) return;
a[++a[0]]=u;
for(edge e:G[u])
if(!vis[e.to]&&!alive[e.to]) vis[e.to]=1,dis[e.to]=dis[u]+e.val,dep[e.to]=dep[u]+1,calc(e.to,rt);
}
void clear(const int& u){
vis[u]=0;
for(edge e:G[u])
if(vis[e.to]) clear(e.to);
}
int pos[N];
inline bool cmp(const int& u,const int& v){return dis[u]<dis[v];}
queue<int> opt;
void dfs(const int& u){
vis[u]=1,find(u);
clear(u);
cnt[0]=0,a[0]=0,alive[root]=1;
for(edge e:G[root])
if(!vis[e.to]&&!alive[e.to]){
vis[e.to]=1,dis[e.to]=e.val,dep[e.to]=1,calc(e.to,e.to);
for(int k=1;k<=a[0];k++)
if(K>=dis[a[k]]) ans=min(ans,dep[a[k]]+cnt[K-dis[a[k]]]);
for(int k=1;k<=a[0];k++)
if(dis[a[k]]<K) opt.emplace(a[k]),cnt[dis[a[k]]]=min(cnt[dis[a[k]]],dep[a[k]]);
a[0]=0;
}
while(!opt.empty()) cnt[dis[opt.front()]]=0x3f3f3f3f,dis[opt.front()]=dep[opt.front()]=siz[opt.front()]=vis[opt.front()]=0,opt.pop();
for(edge e:G[root])
if(!alive[e.to])
max_part=all=siz[e.to],dfs(e.to);
}
signed main(){
memset(cnt,0x3f,sizeof cnt);
read(n,K);
for(int i=1,u,v,w;i<n;i++) read(u,v,w),++u,++v,G[u].emplace_back(edge(v,w)),G[v].emplace_back(edge(u,w));
max_part=all=n,dfs(1);
write(ans>=n?-1:ans);
flush();
return 0;
}
template<typename T> inline void read(T& x){
x=0;bool flag=0;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') flag=1;
if(flag) for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)-(ch&15);
else for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
}
template<typename T> inline void write(T x){
static int sta[40];
int top=0;
if(x<0){
putchar('-');
do sta[top++]=(-x)%10,x/=10;
while(x);
}
else{
do sta[top++]=x%10,x/=10;
while(x);
}
while(top) putchar(sta[--top]^48);
}
template<typename... Args> inline void read(Args& ...args){(void)initializer_list<int>{(read(args),0)...};}
template<typename... Args> inline void write(Args ...args){(void)initializer_list<int>{(write(args),0)...};}