RE+WA 40分求调
查看原帖
RE+WA 40分求调
263414
Sktic楼主2022/10/13 23:01

RT,自己口胡了一份代码()

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
struct edge
{
	int to,k;
};
vector<edge>c[maxn];
multiset<int>mp[maxn];
int n,m;
int a[maxn];
int dfs(int x,int f,int val)
{
	mp[x].clear();
	int s=0;
	for(int i=0;i<c[x].size();i++)
	{
		if(c[x][i].to==f)
			continue;
		s+=dfs(c[x][i].to,x,val);
		mp[x].insert(a[c[x][i].to]+c[x][i].k);
	}
	int mx=0;
	while(!mp[x].empty())
	{
		if(mp[x].size()==1)
		{
			if(*mp[x].begin()<val)
				mx=max(mx,*mp[x].begin()),mp[x].erase(mp[x].find(*mp[x].begin()));
			else
				s++,mp[x].erase(mp[x].find(*mp[x].begin()));
		}
		else
		{
			multiset<int>::iterator it=mp[x].lower_bound(val-*mp[x].begin());
			if(it==mp[x].begin()&&mp[x].count(*it)==1)
				it++;
			if(it==mp[x].end())
			{
				if(*mp[x].end()+*mp[x].begin()<val)
					mx=max(mx,*mp[x].begin()),mp[x].erase(mp[x].find(*mp[x].begin()));
				else
					s++,mp[x].erase(mp[x].find(*mp[x].begin())),mp[x].erase(mp[x].find(*it));
			}
			else
				s++,mp[x].erase(mp[x].find(*mp[x].begin())),mp[x].erase(mp[x].find(*it));
		}
	}
	a[x]=mx;
	return s;
}
int check(int x)
{
	int t=dfs(1,0,x);
	if(t>=m)
		return 1;
	else
		return 0;
}
int main()
{
//	ios::sync_with_stdio(false);
	int sum=0;
	cin>>n>>m;
	for(int i=1;i<=n-1;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		sum+=w;
		c[u].push_back(edge{v,w});
		c[v].push_back(edge{u,w});
	}
	int l=1,r=sum;
	while(l<=r)
	{
		memset(a,0,sizeof(a));
		int mid=(l+r)/2;
		if(check(mid))
			l=mid+1;
		else
			r=mid-1;
	}
	cout<<l-1;
	return 0;
}


2022/10/13 23:01
加载中...