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

P5021 [NOIP2018 提高组] 赛道修建

时间:2024-03-23 21:13:26浏览次数:32  
标签:赛道 std int 路径 ret NOIP2018 read P5021

P5021 [NOIP2018 提高组] 赛道修建

在树上选 \(m\) 条不重合的路径(可以有交点),使得这些路径长度的最小值最大。

看到最小值最大,很自然想到二分模型:枚举最小值 \(L\),看大于等于 \(L\) 的路径能不能有 \(m\) 条。

如何在树上选出 \(m\) 条路径最优成为我们要思考的问题,考虑树上贪心。

普遍的思路是从叶子节点按子树合并,我们要让该子树对父亲的贡献最大,一定是在该子树已经无法拼出路径(贪心)后剩下的路径中取最大值(由于父亲唯一,所以只能留下最大值)。

设 \(f(u)\) 为 \(u\) 子树内的节点到 \(u\) 节点的路径中无法拼出赛道的最长路径,我们已知所有的 \(f(v)+w(u,v)\),对于 \(f(v)+w(u,v)\ge L\) 的,直接贡献+1,对于剩下的,我们可以先让小的路径得到匹配,无法匹配的就更新 \(f(u)\)。这个过程可以用 multiset 维护。

复杂度为 \(O(n\log n\log\sum l)\)。

总结:二分模型,树形贪心的基本思路,合适的数据结构维护。

#include <bits/stdc++.h>
typedef long long ll;
int read() {
	int x = 0, f = 1;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') f = -1;
		c = getchar();
	}
	while(isdigit(c)) {
		x = (x << 3) + (x << 1) + (c - '0');
		c = getchar();
	} 
	return x * f;
}
int n, m, cnt, L, ret, ans;
int h[50010], f[50010];
struct node {
	int to, nxt, w;
} e[100010];
void add(int u, int v, int w) {
	e[++cnt].to = v;
	e[cnt].nxt = h[u];
	e[cnt].w = w;
	h[u] = cnt;
} 
void dfs(int u, int fa) {
	std::multiset<int> s;
	for(int i = h[u]; i; i = e[i].nxt) {
		int v = e[i].to;
		if(v == fa) continue;
		dfs(v, u);
		if(f[v] + e[i].w >= L) ret++;
		else s.insert(f[v] + e[i].w);  
	}
	while(!s.empty()) {
		std::multiset<int>::iterator it = s.begin();
		s.erase(it);
		std::multiset<int>::iterator it2 = s.lower_bound(L - *it);
		if(it2 == s.end()) {
			f[u] = std::max(f[u], *it);
		}
		else {
			s.erase(it2);
			ret++;
		}
	}
}
bool check(int x) {
	L = x;
	ret = 0;
	memset(f, 0, sizeof(f));
	dfs(1, 0);
	return ret >= m;
}
void Solve() {
	n = read(), m = read();
	int r = 0;
	for(int i = 1; i < n; i++) {
		int u = read(), v = read(), w = read();
		add(u, v, w), add(v, u, w);
		r += w;
	}
	int l = 0;
	r = r / m;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(check(mid)) l = mid + 1, ans = mid;
		else r = mid - 1; 
	}
	std::cout << ans << "\n";
}

int main() {
	
	Solve();

	return 0;
}

标签:赛道,std,int,路径,ret,NOIP2018,read,P5021
From: https://www.cnblogs.com/FireRaku/p/18091679

相关文章

  • 有 25 匹⻢和 5 条赛道,赛⻢过程⽆法进⾏计 时,只能知道相对快慢。问最少需要⼏场赛⻢
    先把25匹⻢分成5组,进⾏5场赛⻢,得到每组的排名。再将每组的第1名选出,进⾏1场赛⻢,按照这场的排名将5组先后标为A、B、C、D、E。可以知道,A组的第1名就是所有25匹⻢的第1名。⽽第2、3名只可能在A组的2、3名,B组的第1、2名,和C组的第1名,总共5匹⻢......
  • JAVA实现算法问题25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排
    JAVA实现算法问题25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛随机数模拟25匹马匹速度importjava.lang.reflect.Array;importjava.util.Arrays;publicclassMa{publicstaticvoidmain(String[]args){......
  • NewStarCTF 2023 公开赛道 做题随笔(WEEK1|MISC部分)
    第一题下载打开得到TXT文件好的看样子应该是base32,复制到base在线转换看看得到这玩意 base58转换得到 出了flag  第二题 下载得到一张二维码用隐写软件试试得到一张这个以为是摩斯密码,试试得到有个这玩意,嘶,好像不是试试LSB 得到flag 第三题......
  • P5020 [NOIP2018 提高组] 货币系统
    原题链接题解等价于线性代数中求最大无关组的大小code#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){intn;cin>>n;inta[105]={0};for(inti=1;i<=n;i++)cin>>a[i]......
  • 洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路
    原题链接:https://www.luogu.com.cn/problem/P5019题意解读:最短时间内填满道路,连在一起的不为0的坑可以一起填解题思路:方法1:分治法对于一段连续不同深度的坑,可以最多连续填的天数是最小深度在填满最小深度之后,分别针对其左边和右边的区域再进行填充,这就是此题分治法的理论基......
  • BeginCTF 2024(自由赛道)MISC
    realcheckin题目:从catf1y的笔记本中发现了这个神秘的代码MJSWO2LOPNLUKTCDJ5GWKX3UN5PUEM2HNFXEGVCGL4ZDAMRUL5EDAUDFL5MU6VK7O5UUYMK7GEYWWZK7NE3X2===你能帮助我找到最后的flag吗?我的解答:base32解码begin{WELCOMe_to_B3GinCTF_2024_H0Pe_YOU_wiL1_11ke_i7}下一站上岸......
  • BeginCTF 2024(自由赛道)CRYPTO
    PAD某同学在学习RSA得时候,觉得仅仅靠着比特位得RSA是不安全的,于是参考了部分资料后,灵光乍现Author:lingfengDifficult:easytask.pyimportrandom,mathfromCrypto.Util.numberimport*fromflagimportflagflag=flag[:64]assertlen(flag)==64classRSA():......
  • BeginCTF 2024(自由赛道)
    哈哈哈最后的排名Miscrealcheckin得到题目给了一段密文MJSWO2LOPNLUKTCDJ5GWKX3UN5PUEM2HNFXEGVCGL4ZDAMRUL5EDAUDFL5MU6VK7O5UUYMK7GEYWWZK7NE3X2===base32解码得到flag所以flag为:begin{WELCOMe_to_B3GinCTF_2024_H0Pe_YOU_wiL1_11ke_i7}whereiscrazymanv1.0拿......
  • P5015 [NOIP2018 普及组] 标题统计
    1.题目介绍[NOIP2018普及组]标题统计题目背景NOIP2018普及组T1题目描述凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。输入格式输入文件只有一行,......
  • (区间覆盖问题)P5019 [NOIP2018 提高组] 铺设道路和Educational Codeforces Round 158 (
    区间覆盖问题这里EducationalCodeforcesRound158(RatedforDiv.2)b题和[NOIP2018提高组]铺设道路两道典型题目,本质是相同的。这里由于题目多次出现,特此记录。解题思路:首先我们得对区间做划分,那么划分思路可以是从小到大也可以是从大到小的异常点来做划分(我这是由大到......