洛谷P4383 [八省联考2018]林克卡特树
题目描述
题解
题目可以转化一下,就是要在原树中选出 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]林克卡特树相关推荐
- 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)
题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做"LC ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)
[八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...
- P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)
解析 它还真的不难. 乐. 这题没做出来有些谔谔. 外层wqs二分显而易见,里面不知道为啥我总觉得这个题可以贪心. 然后一直试图在原树直径上下功夫,一筹莫展. 看到题解"dp"两个 ...
- P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分
$ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...
- P4383 [八省联考2018]林克卡特树lct
题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...
- LuoguP4383 [八省联考2018]林克卡特树lct
LuoguP4383 [八省联考2018]林克卡特树lct https://www.luogu.org/problemnew/show/P4383 分析: 题意等价于选择\(K\)条点不相交的链,使得 ...
- luogu4383 bzoj5252[八省联考2018]林克卡特树lct
** [八省联考2018]林克卡特树lct** luogu bzoj 分析 很神仙的一道wqs二分.是真的不会切>-< 如果已经切完了,最优秀的方案就是每个联通块搞直径然后连起来一定是最优 ...
最新文章
- thinkphp概述2
- react系列项目地址
- C#中WinForm程序退出方法技巧总结
- Lanecat网猫的案例
- Finding Structure in Time论文解读
- C++:指针数组理解
- 英特尔Bridge技术加持下 Windows 11 PC也能运行手机应用
- Java编写编译native方法
- c语言数组的一维编程,C语言编程一维数组的使用.doc
- [解题报告]Codeforces 105D Entertaining Geodetics
- Python Flask Web 第八课 —— request 请求对象
- 挑战程序设计竞赛(第2版)1.6.1题
- Tomcat 日志概述
- matlab中uigetfile命令的应用
- NTC热敏电阻的主要技术参数
- 在文档类中控制舞台上影片剪辑
- pandas算加权平均值_Pandas数据帧中多列的加权平均数
- selenium web录制(selenium_ide-2.9.1-fx.xpi和老版本火狐浏览器在最下方)
- 解决python官网下载慢
- python word2vec怎么用_小白看Word2Vec的正确打开姿势|全部理解和应用