社区讨论

求助,下载数据(第四个点)测试正确,提交RE

P5021[NOIP 2018 提高组] 赛道修建参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7x786n
此快照首次捕获于
2025/11/21 05:05
4 个月前
此快照最后确认于
2025/11/21 05:05
4 个月前
查看原帖
代码如下
CPP
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=50005;
int l,r,mid,cnt;
int n,m,h[N],t;
struct edge{int ver,next,val;}f[N*2];
void add(int x,int y,int z){
	f[++t].next=h[x];
	h[x]=t;f[t].ver=y;
	f[t].val=z;
}
int dfs(int x,int fa,int lim){
	vector<int> a;
	for(int i=h[x];i;i=f[i].next){
		int y=f[i].ver;
		if(y==fa) continue;
		int p=dfs(y,x,lim)+f[i].val;
		if(p>=lim) cnt++;
		else a.push_back(p);
	}
	sort(a.begin(),a.end());
	if(a.size()==0) return 0;
	if(a.size()==1) return a.back();
	int i=0,j=a.size()-1;
	while(a[i]+a[j]<lim) ++i;
	while(i<j){
		if(a[i]+a[j]>=lim) a[i++]=a[j--]=0,cnt++;
		else ++i;
	}
	j=a.size()-1;
	while(j!=0&&a[j]==0) --j;
	return a[j];
}
int main(){
	int x,y,z;scanf("%d%d",&n,&m);
	for(int i=1;i<n;++i){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z),add(y,x,z);r+=z;
	}
	while(l<r){
		mid=(l+r)/2+1;cnt=0;
		dfs(1,0,mid);
		if(cnt>=m) l=mid;
		else r=mid-1;
	}
	printf("%d\n",l);
	return 0;
} 

回复

3 条回复,欢迎继续交流。

正在加载回复...