首先二分一下答案,就变成了找长度>=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. Java8 Lambda和Stream的用法

    package com.zhangxueliang.demo; import java.util.ArrayList; import java.util.List; import java.util. ...

  2. spring AOP源码分析(三)

    在上一篇文章 spring AOP源码分析(二)中,我们已经知道如何生成一个代理对象了,那么当代理对象调用代理方法时,增强行为也就是拦截器是如何发挥作用的呢?接下来我们将介绍JDK动态代理和cglib ...

  3. Netty ByteBuf和Nio ByteBuffer

    参考https://blog.csdn.net/jeffleo/article/details/69230112 一.简介 Netty中引入了ByteBuf,它相对于ByteBuffer来说,带来了很 ...

  4. Socket用线程池处理服务

    while(true){ try{ Socket clientSocket = serverSocket.accept(); new Thread(new HandlerThread(clientSo ...

  5. EXAMPLE FOR PEEWEE 多姿势使用 PEEWEE

    使用 PEEWEE 断断续续的差不多已经三个年头了,但是没有像这次使用这么多的特性和功能,所以这次一并记录一下,需要注意的地方和一些使用细节,之后使用起来可能会更方便. 因为是使用的 SQLAched ...

  6. MyBatis基础:MyBatis入门(1)

    1. MyBatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis ...

  7. 莫烦keras学习自修第一天【keras的安装】

    1. 安装步骤 (1)确保已经安装了python2或者python3 (2)安装numpy,python2使用pip2 install numpy, python3则使用pip3 install nu ...

  8. 虚拟机linux系统明明已经安装了ubuntu,但是每次重新进入就又是选择安装界面

    本文转载:https://blog.csdn.net/weixin_41522164/article/details/82814375

  9. Python——列表操作

    一.列表中所有元素出现的次数,并输出为字典模式 def count_list(list): b_list = {} for i in set(list): b_list[i] = list.count ...

  10. 转载:实现MATLAB2016a和M文件关联

    转载自http://blog.csdn.net/qq_22186119 新安装MATLAB2016a之后,发现MATLAB没有和m文件关联 每次打开m文件后都会重新打开一次MATLAB主程序 后来发现 ...