记录编号 600830 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2018]赛道修建 最终得分 100
用户昵称 Gravatar健康铀 是否通过 通过
代码语言 C++ 运行时间 1.858 s
提交时间 2025-05-19 18:56:18 内存使用 28.19 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int INF=0x3f3f3f3f;
int a,b,p,res,x,y,z,mx,l=1,r,ans,s[N],nxt[N],lst[N],Fa[N];
bool vis[N];
vector<pair<int,int> >st[N];
int f(int n){
	return Fa[n]==n?n:Fa[n]=f(Fa[n]);
}
void dfs(int n,int fa){
	s[n]=0;
	vector<int> q;
	q.clear();
	for(int i=0;i<st[n].size();i++){
		int v=st[n][i].first,val=st[n][i].second;
		if(v==fa){
            continue;
        }
		dfs(v,n);
		if(s[v]+val>=p){
            res++;
        }else{
            q.push_back(val+s[v]);
        }
	}
	if(!q.size()){
        return;
    }
	if(q.size()==1){
		s[n]=q[0];
		return;
	}
	sort(q.begin(),q.end());
	for(int i=0;i<=(int)q.size();i++){
        Fa[i]=i;
        vis[i]=0;
    }
	for(int i=0;i<(int)(q.size()-1);i++){
		if(vis[i]){
            continue;
        }
		if(i>=q.size()-1||i==-1){
            break;
        }
		int t=lower_bound(q.begin()+i+1,q.end(),p-q[i])-q.begin();
		if(t>=q.size()){
            continue;
        }
		t=f(t);
		if(t>=q.size()){
            continue;
        }
		if(q[t]+q[i]<p){
            continue;
        }
		vis[t]=1;
		vis[i]=1;
		Fa[t]=t+1;
		res++;
	}
	for(int i=(int)(q.size()-1);i>=0;i--){
        if(!vis[i]){
            s[n]=q[i];
            break;
        }
    }
}
bool check(int n){
	p=n;
	res=0;
	dfs(1,0);
	return res>=b;
}
signed main(){
			freopen("2018track.in","r",stdin);
				freopen("2018track.out","w",stdout);
	cin>>a>>b;
	for(int i=1;i<a;i++){
		cin>>x>>y>>z;
		mx+=z;
		st[x].push_back(make_pair(y,z));
		st[y].push_back(make_pair(x,z));
	}
	r=mx;
	while(l<=r) {
		int mid=(l+r)>>1;
		if(check(mid)){
            l=mid+1;
            ans=mid;
        }else{
            r=mid-1;
        }
	}
	cout<<ans<<endl;
	return 0;
}