wa65玄关求条
查看原帖
wa65玄关求条
690243
houluyu楼主2024/9/4 18:19
#include<bits/stdc++.h>
#define PII pair<int, int> 
#define fi first
#define se second
using namespace std;

const int N = 50005;
int n, m, ans, gx[N], res;//gx表示每个可以对祖先进行的贡献 
vector<vector<PII> > g(N);
multiset<int> s;
void dfs(int x, int fa, int k)
{
	gx[x] = 0;
	for(int i = 0; i < g[x].size(); i ++)
	{
		int y = g[x][i].fi; 
		if(y == fa)continue;
		dfs(y, x, k);
	}
//	cout << x << endl;
	s.clear();
	for(int i = 0; i < g[x].size(); i ++)
	{
		int y = g[x][i].fi, z = g[x][i].se;
		if(y == fa)continue;
		s.insert(gx[y] + z);
	}
//	cout << 1 << endl;
	multiset<int>::iterator it = s.end();
//		cout << *it<< endl;
		while(!s.empty())
		{
			it --;
			if(*it < k)break;
			s.erase(it);
			it = s.end();
			res ++;
		}	
//	cout << 1 << endl;
	//每次基于第一个去往后找 
	while(!s.empty())
	{
		if(s.size() == 1)
		{
			gx[x] = max(*s.begin(), gx[x]);
			return ;
//			s.erase(s.begin());
//			return ;
		}
		it = lower_bound(s.begin(), s.end(), k - *s.begin());
		if(it == s.begin() && s.count(*it) == 1)it ++;
		if(it == s.end())
		{
			gx[x] = max(gx[x], *s.begin());
			s.erase(s.begin());//找不到配对的了 
		}
		else 
		{
			s.erase(s.begin());
			s.erase(it);
			res ++;
		}
	}
}
bool check(int k)
{
	res = 0;
	dfs(1, 0, k);
	return res >= m; 
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i < n; i ++)
    {
		int x, y, z;
		cin >> x >> y >> z;
		g[x].push_back({y, z});
		g[y].push_back({x, z});
	}
//	cout << check(15) << endl;
//	return 0;
    int l = 1, r = 500000005, mid;
	while(l <= r)//二分最小值 
	{
//		memset(gx, 0, sizeof gx);
		mid = (l + r) / 2;
//		cout << mid << endl;
		if(check(mid))
		{
			ans = mid;
			l = mid + 1;
		} 
		else r = mid - 1;
	} 
	cout << ans;
	return 0;

}
2024/9/4 18:19
加载中...