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

    git reset三个选项 --mix,--hard,--soft 数据 针对每个选项都是操作这个文件. [root@centos demo]# git init Initialized empty ...

  2. #Leetcode# 524. Longest Word in Dictionary through Deleting

    https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/ Given a string and a stri ...

  3. Git之项目使用

    现在最为盛行的版本控制器,非git莫属了, 那就看看在项目中我们是如何使用它的吧 一. 在已经存在秘钥对的情况下,我们需要在本地进行相关配置 git config --global user.name ...

  4. python文件封装成*.exe文件(单文件和多文件)

    环境:win10 64位  python3.7 单*.py文件打包Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的P ...

  5. C#设计模式之10:状态模式

    状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...

  6. spring boot中log4j冲突问题和解决办法

    Spring Boot中自带了log4j日志管理.写法应该是: private static final Logger logger = Logger.getLogger(XXX.class); 而不 ...

  7. 902. Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. You ...

  8. Java多线程之线程状态转换图

    说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...

  9. Hibernate 配置文件hibernate.cfg.xml的详细

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式-->               <?xml ...

  10. 如何设置C-Lodop打印控件的端口

    Lodop是一款功能强大的打印控件,在一些浏览器不再支持np插件之后,Lodop公司又推出了C-Lodop,C-Lodop是以服务的方式解决web打印,摆脱了对浏览器的依赖,支持了所有的浏览器. 该控 ...