代码求调,WA#13
查看原帖
代码求调,WA#13
511676
naoliaok_lovely楼主2022/12/6 10:33
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define LL long long

const int N = 2e5 + 10, M = N * 2;
int n, k, ans;
int leaf;
bool flag[N];
priority_queue<int> q;

int h[N], ne[M], e[M], idx;
void add(int a, int b)
{
	e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}

int dfs(int x, int fa)
{
	if(!ne[h[x]])
	{
		leaf++;
		return 1;
	}
	
	int t = 0;
	vector<int> s;
	for(int i = h[x]; i; i = ne[i])
		if(e[i] != fa)
			s.push_back(dfs(e[i], x));
	for(int i : s)
		t = max(t, i);
	for(int i : s)
	{
		if(i == t)
			t++;
		else
			q.push(i);
	}
	return t;
}

int main()
{
	cin >> n >> k;
	for(int i = 1, a, b; i < n; i++)
	{
		scanf("%d%d", &a, &b);
		add(a, b), add(b, a);
	}
	
	q.push(dfs(1, 0));
	
	if(k >= leaf)//好耶,把所有的叶子结点全染了
	{
		if(leaf >= n / 2)
			cout << 1ll * leaf * (n - leaf) << endl;
		else if(k >= n / 2)
			cout << 1ll * (n / 2) * (n - n / 2) << endl;
		else
			cout << 1ll * k * (n - k) << endl;
		return 0; 
	}
	
	int k1 = k;
	while(k1--)
	{
		int t = q.top(); q.pop();
		ans += t;
	}

	LL res = 1e18;
	for(int i = 0; i <= n - ans; i++)
		res = min(res, 1ll * (n - k - i) * (k - i));
	cout << res << endl;
	return 0;
}
2022/12/6 10:33
加载中...