萌新妹子求助二分,样例2挂了/kk
查看原帖
萌新妹子求助二分,样例2挂了/kk
374756
忘怜城羡楼主2024/4/15 22:10
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e4+7;
vector<pair<int,int>> g[MAXN];
int num=0,len[MAXN];
bool vis[MAXN];
void dfs(int x,int from,int mine)
{
	vector<int> t;
	for(int i(0);i<g[x].size();++i)
	{
		if(g[x][i].first!=from)
		{
			dfs(g[x][i].first,x,mine);
			if(len[g[x][i].first]+g[x][i].second>=mine)
				num++;
			else
				t.push_back(len[g[x][i].first]+g[x][i].second);
		}
	}
	sort(t.begin(),t.end());
	for(int i(0);i<t.size();++i)
		vis[i]=0;
	for(int i(0);i<t.size();++i)
	{
		if(vis[i])
			continue;
		int l=i+1,r=t.size()-1,ans=t.size();
		while(l<=r)
		{
			int mid=(l+r)>>1;
			if(t[i]+t[mid]>=mine)
				r=mid-1,ans=mid;
			else
				l=mid+1;
		}
		while(ans<t.size()&&(t[ans]+t[i]<mine||vis[ans]))
			++ans;
		if(ans>=t.size())
			break;
		vis[ans]=vis[i]=1;
		num++;
	}
	for(int i(t.size()-1);i>=0;--i)
		if(!vis[i])
		{
			len[x]=t[i];
			break; 
		} 
	return ;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i(1);i<n;++i)
	{
		int u,v,l;
		scanf("%d%d%d",&u,&v,&l);
		g[u].push_back(make_pair(v,l));
		g[v].push_back(make_pair(u,l));
	}
	int l=0,r=1e9,ans=0;
	while(l<=r)
	{
		memset(len,0,sizeof(len));
		num=0;
		int mid=(l+r)>>1;
		dfs(1,1,mid);
		if(num>=m)
		{
			l=mid+1;
			ans=mid;
		}
		else
			r=mid-1; 
	}
	printf("%d",ans);
	return 0;
}
2024/4/15 22:10
加载中...