** [八省联考2018]林克卡特树lct**

luogu
bzoj

分析

很神仙的一道wqs二分。是真的不会切>-<
如果已经切完了,最优秀的方案就是每个联通块搞直径然后连起来一定是最优的。
换句话说,我们要在树上选择k+1条不同的链,使得这些链的长度之和最长。
转化了一步之后,我们就可以Dp了。
对于这种树上的链的Dp,一般的方法是分单链,过根链和子树链三种
设 f [ 0 / 1 / 2 ] [ i ] [ k ] f[0/1/2][i][k] f[0/1/2][i][k]分别表示子树链,单链,过根链。
注意单链暂时不算链,合并的时候再算
f [ 0 ] [ u ] [ k ] = f [ 0 ] [ u ] [ j ] + f [ 0 ] [ s o n ] [ k − j ] f[0][u][k]=f[0][u][j]+f[0][son][k - j] f[0][u][k]=f[0][u][j]+f[0][son][k−j]
f [ 1 ] [ u ] [ k ] = max ⁡ { f [ 1 ] [ u ] [ j ] + f [ 0 ] [ s o n ] [ k − j ] , f [ 0 ] [ u ] [ j ] + f [ 1 ] [ s o n ] [ k − j ] + w } f[1][u][k]=\max \{f[1][u][j]+f[0][son][k - j], f[0][u][j] + f[1][son][k-j] + w\} f[1][u][k]=max{f[1][u][j]+f[0][son][k−j],f[0][u][j]+f[1][son][k−j]+w}
f [ 2 ] [ u ] [ k ] = max ⁡ { f [ 2 ] [ u ] [ j ] + f [ 0 ] [ s o n ] [ k − j ] , f [ 1 ] [ u ] [ j − 1 ] + f [ 1 ] [ s o n ] [ k − j ] + w } f[2][u][k]=\max \{f[2][u][j]+f[0][son][k - j], f[1][u][j-1]+f[1][son][k-j]+w\} f[2][u][k]=max{f[2][u][j]+f[0][son][k−j],f[1][u][j−1]+f[1][son][k−j]+w}
然后一个神奇的结论是, ( f [ 0 / 1 / 2 ] [ u ] [ k ] ) (f[0/1/2][u][k]) (f[0/1/2][u][k])是随 k k k上凸的,于是我们让选择一条链的时候付出一点“代价”(wqs的套路)
然后看它选了多少条链二分即可。
注意选链的时候要今年往少的选。

代码

#include<bits/stdc++.h>
const int N = 3e5 + 10;
int ri() {char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
int to[N << 1], nx[N << 1], pr[N], w[N << 1], tp, n, k;
long long R, m;
void add(int u, int v, int _w) {to[++tp] = v; nx[tp] = pr[u]; pr[u] = tp; w[tp] = _w;}
void adds(int u, int v, int w) {add(u, v, w); add(v, u, w); R += abs(w);}
struct Data {long long f; int k;Data(long long _f = 0, int _k = 0) : f(_f), k(_k) {}Data operator + (const Data &a) {return Data(f + a.f, k + a.k);}
}f[N][3];
Data add(Data a) {return Data(a.f - m, a.k + 1);}
Data max(Data a, Data b) {return (a.f == b.f ? a.k < b.k : a.f > b.f) ? a : b;}
void Dp(int u, int fa) {f[u][2] = f[u][1] = f[u][0] = Data(0, 0);f[u][2] = max(f[u][2], Data(-m, 1));for(int i = pr[u]; i; i = nx[i]) if(to[i] != fa) {Dp(to[i], u);f[u][2] = max(f[u][2] + f[to[i]][0], add(f[u][1] + f[to[i]][1] + Data(w[i], 0)));f[u][1] = max(f[u][1] + f[to[i]][0], f[u][0] + f[to[i]][1] + Data(w[i], 0));f[u][0] = f[u][0] + f[to[i]][0];}f[u][0] = max(f[u][0], max(add(f[u][1]), f[u][2]));
}
int main() {n = ri(); k = ri() + 1;for(int i = 1, u, v;i < n; ++i)u = ri(), v = ri(), adds(u, v, ri());long long L = -R;for(;L <= R;) {m = L + R >> 1;Dp(1, 0);if(f[1][0].k <= k) R = m - 1;else L = m + 1;}m = L;Dp(1, 0);printf("%lld\n", f[1][0].f + m * k);return 0;
}

luogu4383 bzoj5252[八省联考2018]林克卡特树lct相关推荐

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

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

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

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

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

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

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

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

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

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

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

    题面在这里 description 一个\(N\)个点的\(Tree\),每条边有一个整数边权\(v_i\),表示走这条边会获得\(v_i\)的收益: 小\(L\)需要控制主角\(Link\),\(C ...

  7. [学习笔记]dp凸优化/wqs二分[八省联考2018]林克卡特树lct

    废话 很早就想学wqs二分,结果拖了好久.因为以前是看了几遍都没有懂..(太菜了 后来因为计划里凸优化的题(比如CF321E Ciel and Gondolas,CF739E Gosha is hun ...

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

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

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

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

最新文章

  1. 海思3536:交叉编译Qt4.8.4
  2. Java8 Stream性能如何及评测工具推荐
  3. 超凡先锋怎么进入维护服务器,超凡先锋新手教程怎么过 新手教程攻略_超凡先锋...
  4. C# xml文件读取与修改
  5. 内核中的UDP socket流程(7)——udp_sendmsg
  6. 自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?
  7. 使用FFMPEG类库分离出多媒体文件中的音频码流
  8. android自定义View之曲线图
  9. NetScaler的cookieinsert和sourceip联合保持机制
  10. TurboC 2.0下载及使用方法
  11. java 通配符 删除文件_jQuery removeClass通配符
  12. EPUB和PDF的区别,有什么好用的epub阅读器
  13. 解决ubuntu 18.04安装搜狗输入法 在fcitx的add input method不显示
  14. Js 的防抖与节流代码分析
  15. 网络视频监控系统的现状和发展
  16. 物联网开发笔记(52)- 使用Micropython开发ESP32开发板之W5500以太网网络模块有线网络通信
  17. 计算机选取多个目标按什么键,连续选择多个按什么键
  18. Ubuntu18 安装Kinect驱动(openni、NITE、Sensor)及遇到的问题
  19. SQL截取字符串中的某个特定位置部分
  20. 未转变者服务器可作弊,unturned单人作弊指令

热门文章

  1. js通过判断h5页面是否内嵌在app内
  2. 为什么天线的回波损耗以-10dB大小来衡量?
  3. 用python画糖葫芦_python学习记录四
  4. hive中UDF跟UDAF使用说明
  5. 【Node.js+koa--后端管理系统】设计评论发布、修改、查询、删除接口
  6. 浅谈Memory barrier
  7. ecmp理论的初步认识(持续更新)
  8. 移动端和网页端开发的区别
  9. Android那些事儿 Android手机交互特性
  10. html标签设置提示语,contenteditable元素的placeholder输入提示语设置方法