【题解】 P5021赛道修建
【题解】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赛道修建的更多相关文章
- 二分答案 + multiset || NOIP 2018 D1 T3 || Luogu P5021 赛道修建
题面:P5021 赛道修建 题解:二分答案,用Dfs进行判断,multiset维护. Dfs(x,fa,Lim)用来计算以x为根的子树中有多少符合条件的路径,并返回剩余未使用的最长路径长. 贪心思想很 ...
- 竞赛题解 - NOIP2018 赛道修建
\(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...
- P5021 赛道修建[贪心+二分]
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,-,n1,2,-,n,有 n-1n−1 条适合于修建赛道的双向通 ...
- P5021 赛道修建 题解
原题链接 简要题意: 在一棵树上求 \(m\) 条不相交的路径的最小值的最大值. 本题部分分很多,而且本人也交了 \(27\) 次,所以一定要仔细讲部分分! 算法一 对于 \(b_i = a_i + ...
- [NOIp2018] luogu P5021 赛道修建
我同学的歌 题目描述 你有一棵树,每条边都有权值 did_idi.现在要修建 mmm 条赛道,一条赛道是一条连贯的链,且一条边至多出现在一条赛道里.一条赛道的长被定义为,组成这条赛道的边的权值之和. ...
- P5021 赛道修建 (NOIP2018)
传送门 考场上把暴力都打满了,结果文件输入输出写错了.... 当时时间很充裕,如果认真想想正解是可以想出来的.. 问你 长度最小的赛道长度的最大值 显然二分答案 考虑如何判断是否可行 显然对于一个节点 ...
- 洛谷P5021 赛道修建
题目 首先考虑二分,然后发现最小长度越大的话,赛道就越少.所以可以用最终的赛道个数来判断长度是否合理.问题转化为给定一个长度,问最多有多少条互不重叠路径比这个给定长度大. 考虑贪心,毕竟贪心也是二分c ...
- 洛谷P5021 赛道修建 NOIp2018 贪心+二分答案
正解:贪心+LCA+二分答案 解题报告: 想先港下部分分qwq因为我部分分只拿到了10ptsQAQ(时间不够不是理由,其实还是太弱,所以要想很久,所以才时间不够QAQ m=1 找直径长度,完 一条链 ...
- 题解 NOIP2018【赛道修建】—— 洛谷
这道题有一点点树上dp的意思(大佬轻喷 我刚拿到这道题的时候毫无头绪,只知道这道题要二分答案 为什么是二分答案??? 题目: 目前赛道修建的方案尚未确定.你的任务是设计一 种赛道修建的方案,使得修建的 ...
随机推荐
- Java Hibernate事务并发控制
在产品上线时发现当用户数量大并发性能差,经常发现数据库死锁,经诊断,是由于设置了不正确的事务隔离,可以做如下优级化(这里我们使用JTA事务): JTA具有的3个接口:UserTransaction接口 ...
- 常见指令与功能介绍-java之JSP学习第二天(非原创)
文章大纲 一.JSP 指令二.JSP 动作元素三.JSP 隐式对象四.JSP 客户端请求五.JSP 服务器响应六.JSP HTTP 状态码七.JSP 表单处理八.JSP 过滤器九.JSP Cookie ...
- 2016北京集训测试赛(十三) Problem B: 网络战争
Solution KD tree + 最小割树
- mac 安装 mysql-python
1 首先安装mysql 要那种纯净,独立的mysql,不是xampp里附带的 2 下载 mysql-python压缩包,解压,找到里面的site.cfg里的 mysql_config = /usr/l ...
- nginx 启动,重启,添加开机启动等相关命令
nginx -t 测试 配置文件是否正确,同时可以查看配置文件路径 nginx -c /usr/local/nginx/conf/nginx.conf 启动nginx ps -ef|grep ng ...
- Mogodb集群搭建
1.上传解压软件包 cd /home/dinpay/ 解压:tar -zxvf mongodb-linux-x86_64-rhel62-3.2.2.tgz 重命名: mv mongodb-lin ...
- xml 文件不给提示(以mybatis 的 mapper映射文件为例)
在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...
- zookeeper客户端 和服务器连接时版本问题
在使用kafka 和zookeeper 实现实时分析程序时,由于zookeeper部署版本和分析程序导入jar包的版本不一致,导致了当实时分析程序从远程服务器连接kafka集群的zookeeper时报 ...
- 又一次遇到Data truncation: Data too longData truncation: Data too long问题
往MySQL的blob字段上传文件,结果又出现了Data truncation: Data too longData truncation: Data too long异常. 我的第一反应是查看/et ...
- 软件业的发展方向:云、Web以及App
随着行业互联网的发展,未来的软件发展方向是云技术.Web软件以及基于移动设备的Apps. 桌面软件主要负责大型的计算.渲染和消耗非常大CPU和内存的图形软件,以及基于这些软件的二次开发软件如Revit ...