[学习笔记]dp凸优化/wqs二分[八省联考2018]林克卡特树lct
废话
很早就想学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(nlogk)\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相关推荐
- luogu4383 bzoj5252[八省联考2018]林克卡特树lct
** [八省联考2018]林克卡特树lct** luogu bzoj 分析 很神仙的一道wqs二分.是真的不会切>-< 如果已经切完了,最优秀的方案就是每个联通块搞直径然后连起来一定是最优 ...
- LuoguP4383 [八省联考2018]林克卡特树lct
LuoguP4383 [八省联考2018]林克卡特树lct https://www.luogu.org/problemnew/show/P4383 分析: 题意等价于选择\(K\)条点不相交的链,使得 ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)
题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做"LC ...
- P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分
$ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- [八省联考2018]林克卡特树lct
题面在这里 description 一个\(N\)个点的\(Tree\),每条边有一个整数边权\(v_i\),表示走这条边会获得\(v_i\)的收益: 小\(L\)需要控制主角\(Link\),\(C ...
- P4383 [八省联考2018]林克卡特树lct
题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...
- P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)
[八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...
最新文章
- 在进入新版本 的时候,进行推送引导
- 【Classification】分类的进阶
- 移动web端页面设置的特殊样式列举
- 工业串口和网络软件通讯平台(SuperIO 2.1)更新发布
- 怎么彻底删除oracle
- SQL -- 数据字典生成工具
- LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
- SAP CRM和Cloud for Customer的扩展字段元数据
- linux函数输入,go编程输入函数
- linux搭建oracle脚本,Linux脚本自动安装Oracle
- XPath匹配标签使用text()判断获取结果失败/为空的问题及解决方法
- 30天敏捷生活(7):生成行动计划
- 小小方法,问题锦集。
- 8086CPU寻址方式详解
- 计算机的系统更新速度,Windows 10更新后变慢了?5种方法解决Windows变慢问题
- 7款最流行的在线项目管理工具
- 【Spring】IOC理论推导、IOC本质
- 【论文写作】如何画出好看的图表
- 软件工程:玩“积木”的高手
- python lxml模块是干嘛的_详解lxml模块