很奇怪,校内oj过了,本地过了luogu的第一个数据,时限在范围内,为什么luogu上全T了
#include<bits/stdc++.h>
#define inf (1<<30)
using namespace std;
const int N=4e5+10,MX=1e6;
int n,k,cnt,rt,ns;
int pre[N],now[N],to[N],val[N],tot;
int me[N],siz[N];
int ans=1e9;
int t[MX+10],BT[MX+10];
int b[N],nc,BS[N];
bool vis[N];
vector<int>fk;
int read(){
int a=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){a=(a<<1)+(a<<3)+c-'0';c=getchar();}
return a;
}
void add(int x,int y,int z){
pre[++tot]=now[x];
now[x]=tot;to[tot]=y;
val[tot]=z;
}
void findrt(int u,int F){
me[u]=0;siz[u]=1;
for(int i=now[u];i;i=pre[i]){
int v=to[i];
if(v==F||vis[v])continue;
findrt(v,u);
siz[u]+=siz[v];
me[u]=max(me[u],siz[v]);
}
me[u]=max(me[u],ns-siz[u]);
if(me[u]<me[rt])rt=u;
}
int pre_dfs(int u,int F,int D,int NUM){
b[++nc]=D;BS[nc]=NUM;
for(int i=now[u];i;i=pre[i]){
int v=to[i],z=val[i];
if(vis[v]||v==F)continue;
pre_dfs(v,u,D+z,NUM+1);
}
}
void DFS(int u,int F,int D,int NUM){
if(D<=MX){
t[D]++;
BT[D]=min(BT[D],NUM);
if(t[D]==1)fk.push_back(D);
}
for(int i=now[u];i;i=pre[i]){
int v=to[i],z=val[i];
if(vis[v]||v==F)continue;
DFS(v,u,D+z,NUM+1);
}
}
void solve(int u){
for(int i=0;i<fk.size();i++)
BT[fk[i]]=inf,t[fk[i]]=0;
t[0]++;BT[0]=0;
fk.clear();
for(int i=now[u];i;i=pre[i]){
int v=to[i],z=val[i];
if(vis[v])continue;
nc=0;
pre_dfs(v,u,z,1);
for(int j=1;j<=nc;j++){
int tmp=k-b[j];
if(tmp<0||tmp>MX)continue;
if(t[tmp])ans=min(ans,BS[j]+BT[tmp]);
}
DFS(v,u,z,1);
}
}
void dfs(int u){
solve(u);
vis[u]=true;
for(int i=now[u];i;i=pre[i]){
int v=to[i];
if(vis[v])continue;
ns=siz[v];rt=0;
findrt(v,u);
dfs(rt);
}
}
int main(){
memset(BT,0x3f,sizeof(BT));
n=read();k=read();
for(int i=1;i<n;i++){
int u,v,l;
u=read();v=read();l=read();
u+=1;v+=1;
add(u,v,l);add(v,u,l);
}
me[0]=inf;rt=0;ns=n;
findrt(1,0);
dfs(rt);
if(ans!=1e9)printf("%d",ans);
else puts("-1");
return 0;
}