警示后人(RE on #5#7#8#18#19#20)
查看原帖
警示后人(RE on #5#7#8#18#19#20)
463956
incra楼主2023/9/26 20:02
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
bool LAST = false;
istream& operator >> (istream& in,char* s) {
    if (LAST) return in;
	char ch = cin.get ();
	while ((isspace (ch) || ch == '\n') && ch != EOF) ch = cin.get ();
	int n = 0;
	while (!(isspace (ch) || ch == '\n') && ch != EOF) s[n++] = ch,ch = cin.get ();
	s[n] = '\0';
	if (ch == EOF) LAST = true;
	return in;
}
const int N = 50010;
int n,m;
vector <PII> g[N];
int ans = 0;
multiset <int> s[N];
int DFS (int u,int fa,int x) {
	s[u].clear ();
	int maxlen = 0;
	for (auto [v,w] : g[u]) {
		if (v == fa) continue;
		int val = w + DFS (v,u,x);
		if (val >= x) ans++;
		else s[u].insert (val);
	}
	while (s[u].size ()) {
		if (s[u].size () == 1) return max (maxlen,*s[u].begin ());
		auto it1 = s[u].begin (),it2 = s[u].lower_bound (x - *it1);
		if (it2 == it1 && s[u].count (*it1) == 1) it2++;
		if (it2 == s[u].end ()) {
			maxlen = max (maxlen,*it1);
			s[u].erase (it1);
		}
		else {
			ans++;
			s[u].erase (it1),s[u].erase (it2);	//这句,当*it==*it2时,删除it2时会删除已经被删除的it1,要特判。
		}
	}
	return maxlen;
}
bool check (int x) {
	ans = 0;
	DFS (1,-1,x);
	return ans >= m;
}
int get_dis (int u,int fa,int &ans) {
	int f1 = 0,f2 = 0;
	for (auto [v,w] : g[u]) {
		if (v == fa) continue;
		int len = get_dis (v,u,ans) + w;
		if (len > f1) f1 = len;
		else if (len > f2) f2 = len;
	}
	ans = max (ans,f1 + f2);
	return f1;
}
int main () {
//	freopen ("D:\\download\\P5021_7.in","r",stdin);
	cin >> n >> m;
	for (int i = 1;i <= n - 1;i++) {
		int a,b,c;
		cin >> a >> b >> c;
		g[a].push_back ({b,c}),g[b].push_back ({a,c});
	}
	int l = 0,r = 1e9;
	get_dis (1,-1,r);
	while (l < r) {
		LL mid = l + r + 1 >> 1;
		if (check (mid)) l = mid;
		else r = mid - 1;
	}
	cout << l << endl;
	return 0;
}
2023/9/26 20:02
加载中...