废话

很早就想学wqs二分,结果拖了好久。因为以前是看了几遍都没有懂。。(太菜了
后来因为计划里凸优化的题(比如CF321E Ciel and Gondolas,CF739E Gosha is hunting…)太多了。。又不会高深的数据结构,所以只能硬着头皮学
网上blog这么多,还是wqs神仙本人的论文最好懂。。网上应该会有,这边就不放资源了

然后灵光一现就突然懂了

先上题

这道算是经典题了叭
传送门(小心点提交可能会被封号qaq

题意就不解释了
问题可以转换成求树上不相交的k+1k+1k+1条链的边权和的最大值

显然是树形dp啊
dp[opt][x][i]dp[opt][x][i]dp[opt][x][i],其中optoptopt表示xxx节点的度数(链上的),所以只有可能等于0/1/20/1/20/1/2,xxx表示当前节点,iii表示以xxx为根节点的子树中有iii条链

然后就会有弄出一些转移方程

这里就不写了(自己推一下蛮简单的)

但是这样的时间复杂度是O(nk)\mathcal{O(nk)}O(nk)的,已经可以过掉60分了
然后大佬说这个函数是凸的
然后窝打了一张表发现是真的

那么下面就是今天重点了

然后我们可以发现可以用O(n)\mathcal{O(n)}O(n)的时间求出顶点的坐标
只要转移的时候记录一下现在的k是什么就好了

然后我们可以新定义一个函数f(x)=dp(x)−c×xf(x)=dp(x)-c\times xf(x)=dp(x)−c×x
很容易发现这让函数的顶点的横坐标往左移或者往右移了
发现了什么?这个东西就可以二分了
没错这个就是wqs二分了

于最后就一定能求得一个顶点是(k,f(k))(k,f(k))(k,f(k))
所以dp(x)=f(x)+k∗xdp(x)=f(x)+k*xdp(x)=f(x)+k∗x这个就是最终的答案了
时间复杂度O(nlog⁡k)\mathcal{O(n\log k)}O(nlogk)
是不是很简单???(一脸天真

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 300010using namespace std;
typedef long long LL;LL cnt, lst[N];struct Node{LL to, nxt;LL w;
}e[N << 1];struct Data {LL x, y;Data(LL X = 0, LL Y = 0) {x = X; y = Y;}inline bool operator < (const Data &o) const {return x < o.x || x == o.x && y > o.y;}inline Data operator + (const Data &o) const {return Data(x + o.x, y + o.y);}inline Data operator + (LL o) {return Data(x + o, y);}
}dp[3][N];inline void add(LL u, LL v, LL w) {e[++cnt].to = v;e[cnt].nxt = lst[u];e[cnt].w = w;lst[u] = cnt;
}inline Data nw(Data o, LL v) {return Data(o.x - v, o.y + 1);
}inline void dfs(LL x, LL fa, LL val) {dp[2][x] = Data(-val, 1);for (LL i = lst[x]; i; i = e[i].nxt) {LL son = e[i].to;if (son == fa) continue;dfs(son, x, val);dp[2][x] = max(dp[2][x] + dp[0][son], nw(dp[1][x] + dp[1][son] + e[i].w, val));dp[1][x] = max(dp[1][x] + dp[0][son], dp[0][x] + dp[1][son] + e[i].w);dp[0][x] = dp[0][x] + dp[0][son];}dp[0][x] = max(dp[0][x], max(nw(dp[1][x], val), dp[2][x]));
}int main() {LL n, k;scanf("%lld%lld", &n, &k);k++;LL r = 0;for (LL i = 1, x, y, z; i < n; ++i) {scanf("%lld%lld%lld", &x, &y, &z);add(x, y, z);add(y, x, z);r += abs(z);}LL l = -r;while (l <= r) {LL mid = l + r >> 1;memset(dp, 0, sizeof dp);dfs(1, 0, mid);if (dp[0][1].y <= k) r = mid - 1;else l = mid + 1;}memset(dp, 0, sizeof dp);dfs(1, 0, l);printf("%lld\n", l * k + dp[0][1].x);return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 在进入新版本 的时候,进行推送引导
  2. 【Classification】分类的进阶
  3. 移动web端页面设置的特殊样式列举
  4. 工业串口和网络软件通讯平台(SuperIO 2.1)更新发布
  5. 怎么彻底删除oracle
  6. SQL -- 数据字典生成工具
  7. LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
  8. SAP CRM和Cloud for Customer的扩展字段元数据
  9. linux函数输入,go编程输入函数
  10. linux搭建oracle脚本,Linux脚本自动安装Oracle
  11. XPath匹配标签使用text()判断获取结果失败/为空的问题及解决方法
  12. 30天敏捷生活(7):生成行动计划
  13. 小小方法,问题锦集。
  14. 8086CPU寻址方式详解
  15. 计算机的系统更新速度,Windows 10更新后变慢了?5种方法解决Windows变慢问题
  16. 7款最流行的在线项目管理工具
  17. 【Spring】IOC理论推导、IOC本质
  18. 【论文写作】如何画出好看的图表
  19. 软件工程:玩“积木”的高手
  20. python lxml模块是干嘛的_详解lxml模块

热门文章

  1. 打造高效交付团队心得
  2. 智慧园区可视化地图制作,如何绘制产业园区的电子地图?
  3. 【Python】实现指定数组下标值正序和倒序排序算法功能
  4. 用友金蝶的资本竞技 股权集中与分散的优劣辨析
  5. 机器视觉相机和镜头选型工具——电脑端软件
  6. 2021绥化高考成绩查询,绥化中考成绩查询2021
  7. 工资+副业月入10k的经验都被这几个公众号大佬总结好了
  8. 本人的计算机保研总结
  9. 惠头条自媒体怎么选择领域,惠头条如何爆文
  10. liverpool中文意思_Liverpool是什么意思