原题等价于选择恰好$k+1$条不相交(无公共点)的路径使得边权和最大
证明:对于原题中的最优解,一定包含了k条0边权的边(否则可以将未使用的边删掉,然后将这条路径的末尾与不在同一个连通块内的点连边),那么选择这k条0边权的边所划分的$k+1$条路径即可;对于这$k+1$条路径,将每一条路径首尾连0边权的边,由于这些0边权的边和选择的边无法构成环,因此一定可以删除k条为选择的非0边使其变成一棵树,即原题中的操作
然后令$f(k)$表示选择了恰好k条路径的答案,那么有对于$\forall 1\le i<n$,都有$2f(i)\ge f(i-1)+f(i+1)$,即$f(i)-f(i-1)\ge f(i+1)-f(i)$
证明:建立一张费用流的图:S->i(1,0);i->i'(1,0);i'->T(1,0);i'->j(1,v(i,j))。容易发现$f(x)= 流量为x的最大费用$,由于费用流存在凸性,所以f也存在凸性
根据凸性二分即可,即二分$f(i)-f(i-1)\ge k$,考虑判定:将每条路径权值减去k并选择任意条路径使得权值和最大,那么最后即求出了$f(i)-ki$(特殊情况:$f(k+1)-f(k)=……=f(k+i)-f(k+i-1)$,那么只可以找到$f(k+i)$和$f(k)$,根据等式求出$f(k+1)$即可)
具体的树形dp:用$f[i][j=0/1/2]$表示以i为根的子树选择的端点包含i的边数j,转移分类讨论即可(注意:根据二分的过程,我们要选择尽量多的路径,因此还要记录对应的路径数量,可以用结构体来转移) 
 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define oo 1e12
5 #define ll long long
6 #define pli pair<ll,int>
7 #define fi first
8 #define se second
9 #define mx(k) max(f[k][0],max(f[k][1],f[k][2]))
10 int E,n,m,k,x,y,z,head[N];
11 pli o,f[N][3];
12 struct ji{
13 int nex,to,len;
14 }edge[N<<1];
15 pli add(pli x,pli y){
16 return make_pair(x.fi+y.fi,x.se+y.se);
17 }
18 void add(int x,int y,int z){
19 edge[E].nex=head[x];
20 edge[E].to=y;
21 edge[E].len=z;
22 head[x]=E++;
23 }
24 void dfs(int k,int fa,ll v){
25 f[k][0]=make_pair(0,0);
26 f[k][1]=f[k][2]=make_pair(-v,1);
27 for(int i=head[k];i!=-1;i=edge[i].nex)
28 if (edge[i].to!=fa){
29 int u=edge[i].to;
30 dfs(u,k,v);
31 memcpy(f[0],f[k],sizeof(f[0]));
32 for(int j=0;j<3;j++)f[k][j]=add(f[k][j],mx(u));
33 f[k][1]=max(f[k][1],add(add(f[0][0],f[u][1]),make_pair(edge[i].len,0)));
34 f[k][2]=max(f[k][2],add(add(f[0][1],f[u][1]),make_pair(edge[i].len+v,-1)));
35 }
36 }
37 pli pd(ll k){
38 dfs(1,0,k);
39 return mx(1);
40 }
41 int main(){
42 scanf("%d%d",&n,&m);
43 m++;
44 memset(head,-1,sizeof(head));
45 for(int i=1;i<n;i++){
46 scanf("%d%d%d",&x,&y,&z);
47 add(x,y,z);
48 add(y,x,z);
49 }
50 ll l=-oo,r=oo;
51 while (l<r){
52 ll mid=(l+r+1>>1);
53 if (pd(mid).se>=m)l=mid;
54 else r=mid-1;
55 }
56 o=pd(l-1);
57 printf("%lld",o.fi+o.se*(l-1)+l*(m-o.se));
58 }

[loj2478]林克卡特树的更多相关文章

  1. [八省联考2018]林克卡特树lct——WQS二分

    [八省联考2018]林克卡特树lct 一看这种题就不是lct... 除了直径好拿分,别的都难做. 所以必须转化 突破口在于:连“0”边 对于k=0,我们求直径 k=1,对于(p,q)一定是从p出发,走 ...

  2. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

  3. 【BZOJ5252】林克卡特树(动态规划,凸优化)

    [BZOJ5252]林克卡特树(动态规划,凸优化) 题面 BZOJ(交不了) 洛谷 题解 这个东西显然是随着断开的越来越多,收益增长速度渐渐放慢. 所以可以凸优化. 考虑一个和\(k\)相关的\(dp ...

  4. LuoguP4383 [八省联考2018]林克卡特树lct

    LuoguP4383 [八省联考2018]林克卡特树lct https://www.luogu.org/problemnew/show/P4383 分析: 题意等价于选择\(K\)条点不相交的链,使得 ...

  5. P4383 [八省联考2018]林克卡特树 树形dp Wqs二分

    LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j ...

  6. luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分)

    luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分) Luogu 题解时间 $ k $ 条边权为 $ 0 $ 的边. 是的,边权为零. 转化成选正好 $ k+1 $ 条链. $ ...

  7. 【HEOI 2018】Day2 T2 林克卡特树

    题目大意: 给一个n个节点的树,然后将其分成k+1个联通块,再在每个联通块取一条路径,将其连接起来,求连接起来的路径最大权值. 题解: 考场只会20分,还都打挂了…… 60分的做法其实并不难,nk D ...

  8. bzoj5252 [2018多省省队联测]林克卡特树

    斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...

  9. BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)

    假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...

随机推荐

  1. 记录一次基于VuePress + Github 搭建个人博客

    最终效果图 网站:https://chandler712.github.io/ 一.前言 VuePress 是尤雨溪推出的支持 Vue 及其子项目的文档需求而写的一个项目,UI简洁大方,官方文档详细容 ...

  2. 题解 [ZJOI2019]语言

    题目传送门 题目大意 给出一个 \(n\) 个点的树,现在有 \(m\) 次操作,每次可以选择一个链 \(s,t\),,然后这条链上每个点都会增加一个相同属性,问对于每一个点有与它相同属性的有多少个点 ...

  3. ❤️【Python从入门到精通】(二十七)更进一步的了解Pillow吧!

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 进一步介绍Pillow库的使用,详细了解 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 本文是 ...

  4. LuckySheet一款在线Excel使用心得

    1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...

  5. 2021能源PWN wp

    babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...

  6. 整数划分为k份

    题目 将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入 ...

  7. 第七次Scrum Metting

    日期:2021年5月5日 会议主要内容概述:前后端对接,以及接下来的测试优化等工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 测试数据模块和 ...

  8. 北航OO第三单元总结

    JML基础梳理及工具链 JML的全称是Java Modeling language,即Java建模语言.JML是一种行为接口规格.它为严格的程序设计提供了一套行之有效的方法.通过JML不仅可以基于规格 ...

  9. BUAA 2020 软件工程 结对项目作业

    Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...

  10. mybatis自定义分页拦截器

    最近看了一下项目中代码,发现系统中使用的mybatis分页使用的是mybatis自带的分页,即使用RowBounds来进行分页,而这种分页是基于内存分页,即一次查出所有的数据,然后再返回分页需要的数据 ...