求卡常数
查看原帖
求卡常数
572133
潘德理2010楼主2025/6/14 11:43

tle 75pts. 提交记录

#include<bits/stdc++.h>
using namespace std;
int n,k,x,y,z;
int le=1,ri=5e8+10,mid;
vector<pair<int,int> > e[50050];
int ans;
int vis[50050];
int dfs(int u,int fa){
	if(vis[u]) return 0;
	vis[u]=1;
	multiset<int> s;
	s.clear();
	for(int i=0;i<e[u].size();i++){
		int v=e[u][i].second,w=e[u][i].first;
		if(v==fa) continue;
//		int v1=dfs(v,u);
		w+=dfs(v,u);
		if(w>=mid){
			ans++;
			continue;
		}
	//	printf("%d %d %d\n",v,u,w);
		s.insert(w);
	}
/*	printf("%d %d :: \n",u,fa);
	for(auto it=s.begin();it!=s.end();it++){
		printf("%d ",(*it));
	}
	printf("\n");*/
	while(!s.empty()){
		auto it=--s.end();
		int u=*it;
		if(s.size()==1) return u;
		if(s.empty()) return 0;
		auto it1=lower_bound(s.begin(),s.end(),mid-u);
		if(it1==s.end()||it1==it) return u;
		int v=*it1;
		s.erase(it1);
		auto it2=lower_bound(s.begin(),s.end(),mid-v);
		s.erase(it2);
		ans++;
	}
//	printf("%d\n",ans);
	return 0;
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<n;i++){
		scanf("%d%d%d",&x,&y,&z);
		e[x].push_back({z,y});
		e[y].push_back({z,x});
	}
	while(le<ri){
		mid=(le+ri+1)/2;
//		printf("%d %d %d\n",le,ri,mid);
		ans=0;
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++){
			if(!vis[i]) dfs(i,0);
		}
//		printf("%d\n",ans);
		if(ans>=k){
			le=mid;
		}
		else{
			ri=mid-1;
		}
	}
	printf("%d\n",le);
}
2025/6/14 11:43
加载中...