题目描述

题解

题目可以转化一下,就是要在原树中选出 k+1k+1k+1 条不相交的链使得其权值和最大。

考虑暴力 dp\text{dp}dp : f[u][i][0/1/2]f[u][i][0/1/2]f[u][i][0/1/2] 表示 uuu 子树选了 iii 条链, uuu 没有连边/有一条出边/有两条出边的最大值,可惜是 O(nk2)O(nk^2)O(nk2) 的过不去。

稍微感性理解一下,如果设选出 xxx 的答案为 f(x)f(x)f(x) 的话,那应该是个上凸壳,所以可以采用 wqs\text{wqs}wqs 二分把第二维消掉,具体来说就是选每条链的时候就 −mid-mid−mid ,然后记录一下取最大值的时候选了多少条链即可。效率 O(nlogc)O(nlogc)O(nlogc) 。(感觉写了上一篇就很套路了)

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=3e5+5,M=N<<1;
const LL F=-2e18;LL c;
int n,k,hd[N],V[M],W[M],nx[M],t;
struct O{LL x;int y;}A,f[N][3],g[3];
bool operator < (O A,O B){return A.x!=B.x?A.x<B.x:A.y>B.y;
}
O operator + (O A,O B){return (O){A.x+B.x,A.y+B.y};
}
void add(int u,int v,int w){nx[++t]=hd[u];V[hd[u]=t]=v;W[t]=w;
}
void dfs(int u,int fr){f[u][0]=(O){0,0};f[u][1]=(O){-c,1};f[u][2]=(O){F,0};for (int v,i=hd[u];i;i=nx[i]){if ((v=V[i])==fr) continue;dfs(v,u);for (int j=0;j<3;j++) g[j]=f[u][j];O ax=max(f[v][0],max(f[v][1],f[v][2]));f[u][0]=max(f[u][0],g[0]+ax);f[u][1]=max(f[u][1],g[1]+ax);f[u][1]=max(f[u][1],g[0]+f[v][1]+(O){W[i],0});f[u][2]=max(f[u][2],g[2]+ax);f[u][2]=max(f[u][2],g[1]+f[v][1]+(O){c+W[i],-1});}
}
int main(){cin>>n>>k;k++;LL l,r=0;for (int i=1,u,v,w;i<n;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w),r+=abs(w);l=-r;while(l<r){c=(l+r)>>1,dfs(1,0);A=max(f[1][0],max(f[1][1],f[1][2]));if (A.y>k) l=c+1; else r=c;}c=l;dfs(1,0);cout<<max(f[1][0],max(f[1][1],f[1][2])).x+c*k<<endl;return 0;
}

洛谷P4383 [八省联考2018]林克卡特树相关推荐

  1. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做"LC ...

  2. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  3. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  4. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  5. P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

    解析 它还真的不难. 乐. 这题没做出来有些谔谔. 外层wqs二分显而易见,里面不知道为啥我总觉得这个题可以贪心. 然后一直试图在原树直径上下功夫,一筹莫展. 看到题解"dp"两个 ...

  6. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

  7. P4383 [八省联考2018]林克卡特树lct

    题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...

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

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

  9. luogu4383 bzoj5252[八省联考2018]林克卡特树lct

    ** [八省联考2018]林克卡特树lct** luogu bzoj 分析 很神仙的一道wqs二分.是真的不会切>-< 如果已经切完了,最优秀的方案就是每个联通块搞直径然后连起来一定是最优 ...

最新文章

  1. thinkphp概述2
  2. react系列项目地址
  3. C#中WinForm程序退出方法技巧总结
  4. Lanecat网猫的案例
  5. Finding Structure in Time论文解读
  6. C++:指针数组理解
  7. 英特尔Bridge技术加持下 Windows 11 PC也能运行手机应用
  8. Java编写编译native方法
  9. c语言数组的一维编程,C语言编程一维数组的使用.doc
  10. [解题报告]Codeforces 105D Entertaining Geodetics
  11. Python Flask Web 第八课 —— request 请求对象
  12. 挑战程序设计竞赛(第2版)1.6.1题
  13. Tomcat 日志概述
  14. matlab中uigetfile命令的应用
  15. NTC热敏电阻的主要技术参数
  16. 在文档类中控制舞台上影片剪辑
  17. pandas算加权平均值_Pandas数据帧中多列的加权平均数
  18. selenium web录制(selenium_ide-2.9.1-fx.xpi和老版本火狐浏览器在最下方)
  19. 解决python官网下载慢
  20. python word2vec怎么用_小白看Word2Vec的正确打开姿势|全部理解和应用

热门文章

  1. Android中MediaStore的介绍
  2. Simscape multibody 移动关节
  3. 写在入职字节跳动一周年
  4. Web3赋能新商业模式
  5. opengl三维模型显示界面 qt_Qt OpenGL三维绘图
  6. java控制灯_Java使用桥接模式实现开关和电灯照明功能详解
  7. 【Unity Shaders】Reflecting Your World(反射吧!)介绍
  8. 解读Reformer
  9. 助力新基建,ZStack携手英特尔、阿里云、天翼云等伙伴发布健壮F.T.+新裸金
  10. 淘宝/天猫 添加购物车API接口教程