LuoguP4383 [八省联考2018]林克卡特树lct
LuoguP4383 [八省联考2018]林克卡特树lct
https://www.luogu.org/problemnew/show/P4383
分析:
- 题意等价于选择\(K\)条点不相交的链,使得总路径长度和最大。
- 设\(f[x][i][0/1/2]\)表示\(x\)子树中选了\(i\)个,\(x\)的当前度数为\(0/1/2\)的答案。
- 然后我们感性理解一下可知,选\(k\)个点的方案,一定能够从\(k-1\)个点的方案中转移过来的,不会出现从\(k-i(i>1)\)上再选若干个不在\(k-1\)的方案中的链转移过来答案更优。
- 那么由于我们选择的链的权值是不断变小的,可知\(dp\)值是个凸函数,且单峰。
- 使用带权二分即可,对于本题,整数二分就可以通过。
代码:
// luogu-judger-enable-o2
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 300050
typedef long long ll;
const ll inf = 1ll<<60;
int head[N],to[N<<1],nxt[N<<1],cnt,val[N<<1],n,K,siz[N];
// ll f[N][105][3],tmp[105][3];
struct A {
ll x; int k;
A() {}
A(ll x_,int k_) {x=x_, k=k_;}
bool operator < (const A &u) const {
return x==u.x ? k>u.k : x<u.x;
}
A operator + (const A &u) const {
return A(x+u.x, k+u.k);
}
}f[N][3],ans,tmp[3];
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
template<typename T>void chkmax(T &x,T y) {if(x<y)x=y;}
template<typename T>void chkmin(T &x,T y) {if(y<x)x=y;}
ll C;
// void dfs(int x,int y) {
// int i,j,k,p,q; siz[x]=1;
// memset(f[x],0xc0,sizeof(f[x]));
// f[x][0][0]=f[x][1][2]=0;
// for(i=head[x];i;i=nxt[i]) if(to[i]!=y) {
// dfs(to[i],x);
// for(j=0;j<=K&&j<=siz[x];j++) for(k=0;k<3;k++) tmp[j][k]=f[x][j][k], f[x][j][k]=-inf;
// int t=to[i],len=val[i];
// for(j=0;j<=K&&j<=siz[x];j++) {
// for(k=0;k<=K-j+1&&k<=siz[to[i]];k++) {
// //not choose
// for(p=0;p<3;p++) for(q=0;q<3;q++) chkmax(f[x][j+k][p],tmp[j][p]+f[t][k][q]);
// //choose
// chkmax(f[x][j+k+1][1],tmp[j][0]+f[t][k][0]+len);
// chkmax(f[x][j+k][1],tmp[j][0]+f[t][k][1]+len);
// chkmax(f[x][j+k][2],tmp[j][1]+f[t][k][0]+len);
// chkmax(f[x][j+k-1][2],tmp[j][1]+f[t][k][1]+len);
// }
// }
// siz[x]+=siz[to[i]];
// }
// }
void dfs(int x,int y) {
int i,p,q;
f[x][0]=A(0,0); f[x][1]=A(-inf,0); f[x][2]=A(C,1);
for(i=head[x];i;i=nxt[i]) if(to[i]!=y) {
int t=to[i];
dfs(to[i],x);
memcpy(tmp,f[x],sizeof(f[x]));
f[x][0]=f[x][1]=f[x][2]=A(-inf,0);
//not choose
for(p=0;p<3;p++) for(q=0;q<3;q++) chkmax(f[x][p],tmp[p]+f[t][q]);
chkmax(f[x][1],tmp[0]+f[t][0]+A(val[i]+C,1));
chkmax(f[x][1],tmp[0]+f[t][1]+A(val[i],0));
chkmax(f[x][2],tmp[1]+f[t][0]+A(val[i],0));
chkmax(f[x][2],tmp[1]+f[t][1]+A(val[i]-C,-1));
}
}
int main() {
scanf("%d%d",&n,&K);
K++;
int i,x,y,z;
for(i=1;i<n;i++) {
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
// dfs(1,0);
// printf("%lld\n",max(max(f[1][K][0],f[1][K][1]),f[1][K][2]));
ll l=-1e9, r=1e9;
while(l<r) {
ll mid=(l+r)>>1;
C=mid; dfs(1,0);
ans=max(max(f[1][0],f[1][1]),f[1][2]);
if(ans.k>K) r=mid;
else if(ans.k==K) {
printf("%lld\n",ans.x-K*C); return 0;
}
else l=mid+1;
}
l--;
C=l; dfs(1,0);
ans=max(max(f[1][0],f[1][1]),f[1][2]);
printf("%lld\n",ans.x-K*C);
}
LuoguP4383 [八省联考2018]林克卡特树lct的更多相关文章
- luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分)
luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分) Luogu 题解时间 $ k $ 条边权为 $ 0 $ 的边. 是的,边权为零. 转化成选正好 $ k+1 $ 条链. $ ...
- [八省联考2018]林克卡特树lct——WQS二分
[八省联考2018]林克卡特树lct 一看这种题就不是lct... 除了直径好拿分,别的都难做. 所以必须转化 突破口在于:连“0”边 对于k=0,我们求直径 k=1,对于(p,q)一定是从p出发,走 ...
- 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)
题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...
- [八省联考2018]林克卡特树lct
题解: zhcs的那个题基本上就是抄这个题的,不过背包的分数变成了70分.. 不过得分开来写..因为两个数组不能同时满足 背包的话就是 $f[i][j][0/1]$表示考虑i子树,取j条链,能不能向上 ...
- 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分
题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- [BZOJ5252][八省联考2018]林克卡特树lct
bzoj(上面可以下数据) luogu description 在树上选出\(k\)条点不相交的链,求最大权值. 一个点也算是一条退化的链,其权值为\(0\). sol 别问我为什么现在才写这题 首先 ...
- P4383 [八省联考2018]林克卡特树lct
题目链接 题意分析 一句话题意就是 : 让你选出\((k+1)\)条不相交的链 使得这些链的边权总和最大 (这些链可以是点) 我们考虑使用树形\(DP\) \(dp[i][j][0/1/2]\)表示以 ...
- P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分
$ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...
随机推荐
- Excel中批量把数字类型转换为文本类型
客户给的excel文件中的内容全部是数值类型,这些我们要当成文本存入到数据库,所以需要把所有的数值转换为文本,但是直接通过修改单元格属性来修改的话会变成科学技数法,还有一种方法是在数值得前面加个英文的 ...
- 1、Codevs 必做:2833、1002、1003、2627、2599
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- 九度OJ 1355:扑克牌顺子 (模拟)
时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:1676 解决:484 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^). ...
- 九度OJ 1203:IP地址 (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3038 解决:1496 题目描述: 输入一个ip地址串,判断是否合法. 输入: 输入的第一行包括一个整数n(1<=n<=500) ...
- 我的Android进阶之旅------>MIME类型大全
今天在实现一个安装apk的代码中看到一段代码为:application/vnd.android.package-archive,不知其意,所以百度了一下,了解到这是一种MIME的类型,代表apk类型. ...
- linux 字符驱动
1 结构体说明: struct cdev { struct kobject kobj; // 每一个 cdev 都是一个 kobject st ...
- Linux软件包分类
源代码包 优点: 1.给你的就是源代码 2.可以修改源代码 3.可以自由选择所需的功能 4.软件是在自己电脑上编译安装,所以更加稳定高效 5.卸载方便(直接删了你安装软件的那个目录就好了) 缺点: 1 ...
- 求阶乘,输入一个正整数 n,输出n!
#include<stdio.h>int factorial (int n); int main(){ int n; scanf("%d",&n); print ...
- 隐藏c语言烦人的{ }
.vimrc文件中添加 autocmd BufNewFile,BufRead * :syn match braces conceal "[{}]" set conceallevel ...
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...