首页 > 其他分享 >题解 [NOIP2018 提高组] 赛道修建

题解 [NOIP2018 提高组] 赛道修建

时间:2023-09-07 11:45:45浏览次数:40  
标签:赛道 return int 题解 LL st maxn NOIP2018 sum

题目链接

挺综合的一道题目。

询问最小值最大,考虑二分最小值,二分上下界是 \([最小边权,树的直径]\),但是为了方便我们直接设为 \([1,5\times 10^8]\) 即可。

考虑如何 \(check\),可以采用类似树形 \(dp\) 的方式进行贪心。对于节点 \(u\) 的子树,\(u\) 内部的点显然可以构成几条链,同时我们也可以从 \(u\) 内部引一条链出去,和上面的节点进行搭配,从而使得边权和大于我们二分的值。

问题也就转化为:将 \(u\) 的儿子尽可能的凑合,凑合出最多的链数量,然后从没有凑合好的链中选出一条最长的传上去,也就是说:在保证节点 \(u\) 内部的链数量最多,使得上传的权值最大。

对于节点 \(u\) 的儿子传上来的权值 \(val\),若 \(val\ge mid\),则直接计入贡献即可;反之先放到一边。

对于刚才不符合条件的 \(val\),进行处理:由于要保证最终剩下来的最大,且一对搭配的贡献始终是 \(1\),所以我们从小开始,查找与之搭配符合条件的,并选上,最终剩下的就是最大的。返回到父亲节点即可。

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=5e4+10;
int n,m;
struct node {
	int to,w;
};
vector<node> g[N];

void add(int x,int y,int z) {
	g[x].push_back({y,z});
}

int sum=0;

LL dfs(int nd,int fa,LL s) {
	multiset<LL> st,st2;
	multiset<LL>::iterator it;
	for(node t:g[nd]) {
		int x=t.to,w=t.w;
		if(x==fa) continue;
		LL res=dfs(x,nd,s)+(LL)w;
		if(res>=s) sum++;
		else st.insert(res);
	}
	LL maxn=0;
	while(st.size()>=2) {
		LL minn=*st.begin(); st.erase(st.begin());
		it=st.lower_bound(s-minn);
		if(it==st.end()) { maxn=max(maxn,minn); continue; }
		sum++;
		st.erase(it);
	}
	if(st.size()) return max(maxn,*(--st.end()));
	else return maxn;
}

int check(LL s) {
	sum=0;
	dfs(1,0,s);
	if(sum>=m) return 1;
	else return 0;
}

int main() {
	cin>>n>>m;
	for(int i=1;i<n;i++) {
		int a,b,l; cin>>a>>b>>l;
		add(a,b,l); add(b,a,l);
	}
	LL l=1,r=500000000;
	while(l<r) {
		LL mid=(l+r+(LL)1)/2;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l;
	return 0;
}

标签:赛道,return,int,题解,LL,st,maxn,NOIP2018,sum
From: https://www.cnblogs.com/zhangyuzhe/p/17684400.html

相关文章

  • 【PCL】使用kdtree时pop_t报错问题解决
    问题描述在使用kdtree时,遇到的报错,具体报错信息如下:提示找不到pop_t,点击错误信息会进入到dist.h文件中问题解决解决办法很简单,在这里简单总结一下进入dist.h文件中,将下面这行代码,应该是在源文件的503行:typedefunsignedlonglongpop_t;具体位置如下图所示:将这行代码......
  • FTP权限问题解析,553 Can't open that file: Permission denied
    FTP权限问题解析,553Can'topenthatfile:Permissiondenied FTP上传文件,提示553Can'topenthatfile:Permissiondenied原因:目录的所属组,所属用户属于root,导致FTP无法上传,修改组和所属用户为www即可chown-fRwww./*chgrp-fRwww./* ......
  • 9.6 CF1830 题解
    9.6CF1830题解A.CopilCopacDrawsTrees链接真弱智题不用讲B.TheBOSSCanCountPairs题意每组数据给你一个\(n\)和两个序列\(a,b\)。求有多少个数对\((i,j)\)满足\(1\lei<j\len\)且\(a_i\timesa_j=b_i+b_j\)。题解考虑\(a_i\timesa_j=b_i......
  • 【题解】CF2600DP 选练(23.9.5-23.9.6)
    低情商:感觉是比较套路的高情商:十分educational!!!CF258DLittleElephantandBrokenSorting题目描述:有一个\([1,n]\)的排列\(a\),会进行\(m\)次操作,操作为交换\((a_i,a_j)\)。每次操作都有\(50\%\)的概率进行。求进行\(m\)次操作以后的期望逆序对个数。\(n,m\le1......
  • 爱思创CSP第一轮模拟赛01易错题解析
    一.1.错误原因:不知道解析:正确答案B星型结构,类似于一颗星星,优点是节省材料,弊端是,如果源点计算机故障,那么网络就会瘫痪。环形结构,类似于一个环,环上有一些端点,每个端点对应着一台计算机,弊端是,如果在环上断了2条边,网络就会瘫痪网状结构,就是现在的因特网(Internet),类似于一张图,......
  • $9.6$ 短学期题解
    \(a\)inta[N];voidsolve(){intn=read();for(inti=1;i<=n;i++){a[i]=read();}sort(a+1,a+1+n);intans=0;for(inti=1;i<=min(5,n);i++){if(a[i]<=300)ans++;}puts(ans>=5?"PentaKill&qu......
  • Iksevi 题解
    题目大意\(n\)次询问,每次给定一个点\((x,y),x\ge0,y\ge0\),问有多少种对角线长为偶数的正方形使得在用该正方形正密铺第一象限的情况下该点位于正方形顶点上。正密铺第一象限指将第一个正方形的角与\(x\)轴和\(y\)轴接触。此后的正方形都与至少一个已放置的正方形有一......
  • 【题解】CF1852C Ina of the Mountain
    我们先从题目的一部分入手。如果说,我们没有当一个数为\(0\)时,让这个数变成\(k\)的性质,我们如何求答案呢?很简单,在图上就是:绿色线段的长度加起来即为答案(本图中是\(6\))我们考虑很显然地,将一个数从\(0\)变为\(k\)即为将一个数一开始加上\(k\)我们如果要让第\(i\)列......
  • Java语言与其环境:常见问题解答
    Java语言与其环境:常见问题解答在本博客文章中,将深入探讨Java编程语言的特点和环境,解释一些常见的关于Java的疑问。Java语言的特点是什么?Java是一种高级编程语言,它具有以下几个主要的特点:简单:Java的语法与C和C++非常相似,但它消除了这两种语言中的许多复杂和很少使用的特性,如......
  • 【题解】ABC318
    AtCoder-ABC318AFullMoon暴力枚举判断。提交记录:Submission-AtCoderAtCoder-ABC318BOverlappingSheets暴力枚举判断。提交记录:Submission-AtCoderAtCoder-ABC318CBlueSpring使用通票一定是用在最大的\(kd\)天,排序后枚举\(k\)即可。提交记录:Submission-AtC......