样例、自己手造的数据都过了,但是只有65分,而且好像所有的输出都比答案大。。看了好久也没看出哪里错了,求大佬帮忙康康qwq
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=5e4+5;
int n,m,sum,ans;
int fa[N],dep[N],vis[N],up[N];
struct edge
{
int v,w;
};
vector<edge>e[N];
vector<edge>ne;
bool cmp(edge x,edge y)
{
return x.w<y.w;
}
void dfs1(int x,int from)
{
fa[x]=from;
dep[x]=dep[from]+1;
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].v;
if(to==from)continue;
dfs1(to,x);
}
return;
}
void output()
{
for(int i=1;i<=n;i++)printf("(%d,%d)\n",fa[i],dep[i]);
return;
}
void dfs2(int x,int t)
{
for(int i=0;i<e[x].size();i++)
{
int to=e[x][i].v;
if(to==fa[x])continue;
dfs2(to,t);
}
int tail;
ne=e[x];
for(int i=0;i<ne.size();i++)
{
int to=ne[i].v;
if(to==fa[x])continue;
if(up[to]>0)ne[i].w+=up[to];
}
sort(ne.begin(),ne.end(),cmp);
for(tail=ne.size()-1;tail>=0,ne[tail].w>=t;tail--)
sum++;
for(int i=0;i<=tail;i++)
{
int to=ne[i].v;
if(to==fa[x]||vis[to]==x)continue;
int l=i+1,r=tail;
// int mid;
int pst=tail+1;
while(l<=r)
{
int mid=(l+r)>>1;
if(ne[mid].w+ne[i].w>=t)pst=mid,r=mid-1;
else l=mid+1;
}
while((vis[ne[pst].v]==x||ne[pst].v==fa[x])&&pst<=tail)pst++;//要限制以下pst<=tail
if(pst<=tail)
{
vis[to]=x;
vis[ne[pst].v]=x;
sum++;
}
}
up[x]=0;
for(int i=tail;i>=0;i--)
{
int to=ne[i].v;
if(vis[to]==x||to==fa[x])continue;
up[x]=ne[i].w;
break;
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[u].push_back((edge{v,w}));
e[v].push_back((edge{u,w}));
}
for(int i=1;i<=n;i++)
sort(e[i].begin(),e[i].end(),cmp);
dfs1(1,0);
int l=0,r=0x7fffffff;
while(l<=r)
{
int mid=(l+r)>>1;
sum=0;
memset(vis,0,sizeof(vis));
dfs2(1,mid);
if(sum>=m)ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}