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

P5021 [NOIP2018 提高组] 赛道修建 思路简记

时间:2022-08-24 19:34:27浏览次数:66  
标签:赛道 tmp node int NOIP2018 fa P5021 nowv now

发现答案具有单调性,尝试一下二分答案能不能做

二分答案 \(t\) 后,问题的关键就变成最多能找到多少条长度大于等于 \(t\) 的赛道

我们先假设整棵树以 \(1\) 为根

把样例的图放出来:

我们可以发现一个性质:

如果一个链,它经过了结点 \(i\) 的父结点,同时包含了 \(i\) 到子结点的某条边,那么它只能包含 \(i\) 到所有子结点的边当中的一条。

也就是说对于任意一个点 \(i\) (其父亲为 \(fa\)) 以及其子树内的节点 \(j,k\),对于链 \(j\to i\),我们只用考虑 \(3\) 种情况

  • 不用这条链

  • 用 \(j\to i\to k\) 这条链

  • 用 \(j\to i\to fa\) 这条链 (注意 \(i\to fa\) 只能用一次)

那么我们贪心地考虑的就是:先按照第二种情况尽量将 \(i\) 子树各种链合并,然后在把剩下链中长度最大的链和 \(i\to fa\) 合并,传给 \(fa\)。

那么我们就可以采用双指针的方式贪心配对,让每一条链匹配到可行的且长度最小的链

这里我用的是 \(multiset\) \(+\) 二分实现

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

const int N=5e4+5;
const int inf=1e9;

struct node{
	int x,v;
};

int n,m;
vector <node> G[N];

inline node dfs(int x,int fa,int t){
	multiset <int> s;
	node now={0,0};
	for(auto y:G[x]){
		if(y.x==fa) continue;
        node tmp=dfs(y.x,x,t);
		int val=tmp.x+y.v;
        now.v+=tmp.v;
		if(val>=t) ++now.v;
		else s.insert(val);
	}
	while(!s.empty()){
		int nowv=*s.begin();
		if(s.size()==1){
			now.x=max(now.x,nowv);
			break;
		}
		auto tmp=s.lower_bound(t-nowv);
		if(tmp==s.begin()&&s.count(*tmp)==1) ++tmp;
		if(tmp!=s.end()){
			++now.v;
			s.erase(s.find(*tmp));
		}
		else now.x=max(now.x,nowv);
		s.erase(s.find(*s.begin()));
	}
	return now;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1,x,y,z;i<n;++i){
		cin>>x>>y>>z;
		G[x].push_back({y,z});
		G[y].push_back({x,z});
	}
	int l=0,r=inf;
	while(l<r-1){
		int mid=l+r>>1;
		if(dfs(1,0,mid).v>=m) l=mid;
		else r=mid;
	}
	cout<<l<<endl;
}

标签:赛道,tmp,node,int,NOIP2018,fa,P5021,nowv,now
From: https://www.cnblogs.com/into-qwq/p/16621304.html

相关文章

  • 雅礼NOIP2018集训 day5
    雅礼NOIP2018集训day5联题面由于出题人懒所以没有背景。一个无限长的01序列,初始全为0,每次选择一个区间[l,r]进行操作,有三种操作:•1lr将[l,r]中所有元素变......
  • 雅礼NOIP2018集训 day5 赛
    雅礼NOIP2018集训day5赛题面由于出题人思维枯竭所以想不出好玩的背景。有n个物品,第i个物品的价格是vi,有两个人,每个人都喜欢n个物品中的一些物品。要求选出正......
  • 雅礼NOIP2018集训 day3 u
    雅礼NOIP2018集训day3u题面考虑一个\(n*n\)的矩阵\(A\),初始所有元素均为\(0\)。执行\(q\)次如下形式的操作:给定\(4\)个整数\(r,c,l,s\),对于每个满足\(x\in[r,r+l),y\in......
  • 传球游戏【NOIP2018普及组T3】(ybtoj 递推例题2)
    题目描述上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的: 个同学站成一个圆圈,其中的一个同学手里拿着一......
  • 非理性独立开发者=>关于赛道选择
    以往从没有写过副业类型的分享,前段时间与一位高管朋友聊天才意识到这也可以作为我博客的一部分。共同学习,共同进步。为什么分享这个主题  因为这是项目的最开始,也就......
  • 雅礼NOIP2018集训 day3 w
    雅礼NOIP2018集训day3w题面有一棵n个节点的树,每条边长度为1,颜色为黑或白。可以执行若干次如下操作:选择一条简单路径,反转路径上所有边的颜色。对于某些边,要求在操作结......
  • noip2018提高组初赛试题
    一、单项选择题(共10题,每题2分,共计20分;每题有且仅有一个正确选项)\2.下列属于解释执行的程序设计语言是()。A.CB.C++C.PascalD.Python答案:D解析:编译语言:C......
  • NC21467 [NOIP2018]货币系统
    题目链接题目题目描述在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为n、面额数组为a[1..n]的......