首先二分一下答案,就变成了找长度>=m的 不相交的路径的个数

考虑到在一个子树中,只有一个点能出这个子树去和别的点搞

所以我这个子树里尽量自我满足是不会有坏处的

而且要在自我满足数最大的条件下,剩下一个尽量大的去把他搞出去

具体来说,我们设f[x]是x的子树中的满足条件的最大路径数,g[x]是在f[x]最大的情况下能剩下来的x的子树中到x的最大的路径长度

我们假设y们是x的孩子们,那我们拿着g[y]+edge[x][y],又可以拼出好多路径

首先如果他已经>=m了,那就直接f[x]++

然后我把剩下的排个序,开一个l一个r,对着扫,我找能满足它的最小的那个,然后把他俩踢掉

但踢完以后我还要把r往右搞,因为有可能再把它往左搞的话他就不能满足新的l+1了

所以需要用一个双向链表来做

但还有一个问题,我不能在l>=r的时候就直接跳出,考虑1 2 4 5,我第一次做完以后l指在4 r也指在4 所以我要让r再跳一跳,直到他跳出去了在结束

还是看代码吧...

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e4+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){
if(c=='-') neg=-;
c=getchar();
}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxn*][],egh[maxn],ect;
int N,M,f[maxn],g[maxn],son[maxn],sh;
int nxt[maxn],pre[maxn]; inline void adeg(int a,int b,int c){
eg[++ect][]=b,eg[ect][]=c,eg[ect][]=egh[a],egh[a]=ect;
} inline bool cmp(int a,int b){
return g[a]<g[b];
} void dfs(int x,int fa,int k){
f[x]=g[x]=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa) continue;
dfs(b,x,k);
}sh=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa) continue;
son[++sh]=b;
g[b]+=eg[i][];f[x]+=f[b];
}
sort(son+,son+sh+,cmp);
int l=,r=sh;
pre[]=;nxt[]=,pre[sh+]=sh;nxt[sh+]=;
for(int i=;i<=sh;i++){
pre[i]=i-;nxt[i]=i+;
}
for(;r;r=pre[r]){
if(g[son[r]]<k) break;
f[x]++;
pre[nxt[r]]=pre[r],nxt[pre[r]]=nxt[r];
}
for(;l<=sh;l=nxt[l]){
for(;l<pre[r]&&g[son[l]]+g[son[pre[r]]]>=k;r=pre[r]);
if(l<r&&r<=sh&&g[son[l]]+g[son[r]]>=k){
f[x]++;
pre[nxt[r]]=pre[r],nxt[pre[r]]=nxt[r];
pre[nxt[l]]=pre[l],nxt[pre[l]]=nxt[l];
r=nxt[r];
}
while(nxt[l]<=sh&&r<=nxt[l]) r=nxt[r];
}
if(pre[sh+]) g[x]=g[son[pre[sh+]]];
}
inline bool judge(int k){
dfs(,,k);
return f[]>=M;
} int main(){
// freopen("track.in","r",stdin);
// freopen("track.out","w",stdout);
int i,j,k;
N=rd(),M=rd();
int l=,r=,ans=;
for(i=;i<N;i++){
int a=rd(),b=rd(),c=rd();
r+=c;
adeg(a,b,c);adeg(b,a,c);
}
while(l<=r){
int m=l+r>>;
if(judge(m)) l=m+,ans=m;
else r=m-;
}
printf("%d\n",ans); return ;
}

luogu5021 [NOIp2018]赛道修建 (二分答案+dp(贪心?))的更多相关文章

  1. Luogu5021 [NOIP2018]赛道修建

    Luogu5021 [NOIP2018]赛道修建 一棵大小为 \(n\) 的树,边带权.选 \(m\) 条链使得长度和最小的链最大. \(m<n\leq5\times10^4\) 贪心,二分答案 ...

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

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

  3. 【LG5021】[NOIP2018]赛道修建

    [LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...

  4. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

  5. BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列

    BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...

  6. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  7. 【noip2018】【luogu5021】赛道修建

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

  8. BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心

    题目大意:给定一棵树,有一些点是关键点,要求选择不超过mm个点.使得全部关键点到近期的选择的点距离最大值最小 二分答案,问题转化为: 给定一棵树,有一些点是关键点,要求选择最少的点使得每一个关键点到选 ...

  9. NOIP2012疫情控制(二分答案+倍增+贪心)

    Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...

随机推荐

  1. 分布式文件系统FastDFS

    fastdfs_百度百科https://baike.baidu.com/item/fastdfs/5609710 用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园http ...

  2. [转帖]中关村:LED屏幕和OLED屏幕有什么区别?答案在这里

    LED屏幕和OLED屏幕有什么区别?答案在这里   中关村在线 01-0810:40 目前的电视市场,更新换代的频率越来越快,无论是国产品牌还是合资品牌,都不约而同的推出了全新产品.这离不开人们对更好 ...

  3. vue-cli 上传图片上传到OSS(阿里云)

    https://help.aliyun.com/document_detail/32068.html?spm=5176.doc32069.6.304.Qc4SUs(看) https://help.al ...

  4. Flutter 中 JSON 解析

    本文介绍一下Flutter中如何进行json数据的解析.在移动端开发中,请求服务端返回json数据并解析是一个很常见的使用场景.Android原生开发中,有GsonFormat这样的神器,一键生成Ja ...

  5. tensorflow实现基于LSTM的文本分类方法

    tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...

  6. Linux基础学习(14)--日志管理

    第十四章——日志管理 一.日志管理简介 1.日志服务: 2.常见日志的作用: 二. rsyslogd日志服务 1.日志文件格式: 2./etc/rsyslog.conf配置文件: 三.日志轮替 1.日 ...

  7. 莫烦keras学习自修第五天【CNN卷积神经网络】

    1.代码实战 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np np.random.seed(1337) # for r ...

  8. fiddler 笔记-设置断点

    设置断点后,可以修改httprequest的任何信息包括:host,cookie或都表单中的数据 1 Fiddler--rules--Automatic Breakpoint --before Req ...

  9. Python——FTP上传和下载

    一.FTP对象方法说明 login(user='anonymous',passwd='', acct='') 登录 FTP 服务器,所有参数都是可选的 pwd() 获得当前工作目录 cwd(path) ...

  10. Lodop打印项对象类型属性区分

    Lodop提供了一些打印项类型,默认是普通项,通过设置打印对象的类型,可以实现一些普通项不能实现的效果.例如:该博客另一篇博文 标题是Lodop打印控件 打印‘接下一页’‘以下空白’,就用了眉脚项. ...