【题解】P5021 赛道修建

二分加贪心,轻松拿省一(我没有QAQ)

题干有提示:

输出格式:

输出共一行,包含一个整数,表示长度最小的赛道长度的最大值。

注意到没,最小的最大值,还要多明显?

那么我们考虑二分。

直接二分答案,假设我们得到了二分答案\(x\),我们就利用这个答案检查是否可行。考虑这样的一种办法,指定一个点为树的根,先将\(dfs\)放下去,每个\(dfs\)都要尽量将这个节点内所有的赛道合成成满足\(\ge x\),并且贡献一条尽量长的赛道上去。假设有一个\(dfs\)表示自己有多于两条多出来的赛道,它们接起来不能满足条件,那么这个答案非法。

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<vector>
#include<set>
#include<map>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<ctime> using namespace std;
#define TMP template < class ins >
#define endl '\n'
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;t++)
#define ERP(t,a) for(register int t=head[(a)];t;t=e[t].nx)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;t--)
#define more(a,b) (a)=(a)>(b)?(a):(b)
typedef long long ll;
TMP inline ins qr(ins tag) {
char c=getchar();
ins x=0;
int q=0;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=50050;
struct E {
int to,w,nx;
} e[maxn<<1];
int head[maxn];
ll d[maxn];
int cnt;
inline void add(int fr,int to,int w,bool f) {
e[++cnt]=(E) {
to,w,head[fr]
};
head[fr]=cnt;
if(f)
add(to,fr,w,0);
}
int n,m;
ll ans;
ll cmp;
#define pb insert
multiset<ll> sav[maxn];
#define tor multiset<ll>::iterator ll dfs(int now,int last) {
if(ans>=m)
return 0;
ERP(t,now) {
if(e[t].to!=last) {
ll temp=dfs(e[t].to,now)+e[t].w;
if(temp>=cmp)
ans++;
else
sav[now].pb(temp);
if(ans>=m)
return 0;
}
}
ll ret=0;
if(sav[now].size()==1)
return max(0ll,*sav[now].begin());
while(sav[now].size()) {
tor b=sav[now].begin();
tor k=sav[now].lower_bound(cmp-(*b));
if(k==sav[now].end()) {
more(ret,*b);
sav[now].erase(b);
continue;
}
if(k==b)
k++;
if(k==sav[now].end()) {
more(ret,*b);
sav[now].erase(b);
continue;
}
ans++;
if(ans>=m)
return 0;
if(k==b)
sav[now].erase(k);
else {
sav[now].erase(k);
sav[now].erase(b);
}
}
return ret;
} inline bool chek(int x) {
RP(t,1,n)
sav[t].clear();
cmp=x;
ans=0;
dfs(1,0);
return ans>=m;
} inline int eff(int rb) {
int lb=1,mid;
do {
mid=(lb+rb)>>1;
//cout<<rb<<' '<<mid<<' '<<lb<<endl;
if(chek(mid))
lb=mid+1;
else
rb=mid-1;
} while(lb<=rb);
return rb;
} void predfs(int now,int last,int w) {
d[now]=d[last]+w;
ERP(t,now)
if(e[t].to!=last)
predfs(e[t].to,now,e[t].w);
}
int t1,t2,t3;
const int inf=0x3f3f3f3f;
inline void init() {
n=qr(1);
m=qr(1);
RP(t,1,n-1) {
t1=qr(1);
t2=qr(1);
t3=qr(1);
add(t1,t2,t3,1);
}
predfs(1,0,0);
ll sav=0,rem=-inf;
RP(t,1,n)
if(d[t]>rem)
sav=t,rem=d[t];
predfs(sav,0,0);
sav=0,rem=-inf;
RP(t,1,n)
if(d[t]>rem)
sav=t,rem=d[t];
cout<<eff(rem)<<endl;
} signed main() {
#ifndef ONLINE_JUDGE
freopen("testdata.in","r",stdin);
freopen("out.out","w",stdout);
#endif
init();
return 0;
}

【题解】 P5021赛道修建的更多相关文章

  1. 二分答案 + multiset || NOIP 2018 D1 T3 || Luogu P5021 赛道修建

    题面:P5021 赛道修建 题解:二分答案,用Dfs进行判断,multiset维护. Dfs(x,fa,Lim)用来计算以x为根的子树中有多少符合条件的路径,并返回剩余未使用的最长路径长. 贪心思想很 ...

  2. 竞赛题解 - NOIP2018 赛道修建

    \(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...

  3. P5021 赛道修建[贪心+二分]

    题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,-,n1,2,-,n,有 n-1n−1 条适合于修建赛道的双向通 ...

  4. P5021 赛道修建 题解

    原题链接 简要题意: 在一棵树上求 \(m\) 条不相交的路径的最小值的最大值. 本题部分分很多,而且本人也交了 \(27\) 次,所以一定要仔细讲部分分! 算法一 对于 \(b_i = a_i + ...

  5. [NOIp2018] luogu P5021 赛道修建

    我同学的歌 题目描述 你有一棵树,每条边都有权值 did_idi​.现在要修建 mmm 条赛道,一条赛道是一条连贯的链,且一条边至多出现在一条赛道里.一条赛道的长被定义为,组成这条赛道的边的权值之和. ...

  6. P5021 赛道修建 (NOIP2018)

    传送门 考场上把暴力都打满了,结果文件输入输出写错了.... 当时时间很充裕,如果认真想想正解是可以想出来的.. 问你 长度最小的赛道长度的最大值 显然二分答案 考虑如何判断是否可行 显然对于一个节点 ...

  7. 洛谷P5021 赛道修建

    题目 首先考虑二分,然后发现最小长度越大的话,赛道就越少.所以可以用最终的赛道个数来判断长度是否合理.问题转化为给定一个长度,问最多有多少条互不重叠路径比这个给定长度大. 考虑贪心,毕竟贪心也是二分c ...

  8. 洛谷P5021 赛道修建 NOIp2018 贪心+二分答案

    正解:贪心+LCA+二分答案 解题报告: 想先港下部分分qwq因为我部分分只拿到了10ptsQAQ(时间不够不是理由,其实还是太弱,所以要想很久,所以才时间不够QAQ m=1 找直径长度,完 一条链 ...

  9. 题解 NOIP2018【赛道修建】—— 洛谷

    这道题有一点点树上dp的意思(大佬轻喷 我刚拿到这道题的时候毫无头绪,只知道这道题要二分答案 为什么是二分答案??? 题目: 目前赛道修建的方案尚未确定.你的任务是设计一 种赛道修建的方案,使得修建的 ...

随机推荐

  1. 苹果iOS APP配置HTTPS,iOS ATS配置SSL,苹果ATS标准解决方案

    参考沃通:

  2. git——简易指南

    Git对于我来说,只知道是一个版本控制器,类似于乌龟的svn.其中也仅仅会几个常的命令,比如说“更新git pull”.“提交git push”等等,因为记得当初使用的时候,师傅告诉我,对于你不懂这个 ...

  3. Scut游戏服务器引擎6.1.5.6发布,直接可运行,支持热更新

    1. 增加exe版(console),web版本(IIS)的游戏服宿主程序 2. 增加Model支持脚本化,实现不停服更新 3. 增加Language支持脚本化 4. 修改Sns与Pay Center ...

  4. zabbix学习系列之触发器

    触发器的简介 监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值 每一个触发器 ...

  5. 点击页面li显示li中文字

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. 地图之CLLocationManager的使用 定位功能使用

    1.iOS8曾经使用CLLocationManager 1.导入头文件 <CoreLocation/CoreLocation.h> 2.创建位置管理者 CLLocationManager ...

  7. Swift初窥----语法进阶

    缺省绑定(Optional Binding 自己主动置空) 通过在类型变量后,加上?,能够实现缺省绑定为nil var window: UIWindow? 就是说,假设不正确window赋值,则win ...

  8. setTimeout()基础/setInterval()基础

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  9. 转:3.3V和5V电平双向转换——NMOS管

    分简单,仅由3个电阻加一个MOS管构成,电路图如下: 此电路来自于飞利浦的一篇设计指导文档,是I2C总线官方推荐使用的电平转换电路.在实际使用过程中,需要尤其注意NMOS管的选型以及上拉电阻阻值的选取 ...

  10. Chrome禁用NPAPI插件(包含 Silverlight、Java 和 Unity)

    过去,很多插件都是使用一种称为NPAPI 的旧系统开发的. 现在,仅仅有少量站点在使用NPAPI 插件,由于这些插件有时会给站点带来安全风险. 为了让用户获得更安全.更高速且更稳定的 Chrome 浏 ...