【BZOJ5252】林克卡特树(动态规划,凸优化)

题面

BZOJ(交不了)

洛谷

题解

这个东西显然是随着断开的越来越多,收益增长速度渐渐放慢。

所以可以凸优化。

考虑一个和\(k\)相关的\(dp\)

这个题目可以转换为在树上选择\(K\)条不相交的路径。

设\(f[i][0/1/2]\)表示当前点\(i\),这个点不和父亲连/和父亲连/在这里将两条链合并的最优值。

再记一维\(k\),表示子树中已经选了\(k\)条链。

这样子可以直接转移。

那么凸优化\(dp\),再额外记录一下最优解的链的最小值,就好了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next,w;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
ll sum;
int n,K;
struct Node{ll x;int y;}f[3][MAX],ans;
bool operator<(Node a,Node b){if(a.x!=b.x)return a.x<b.x;return a.y>b.y;}
Node operator+(Node a,Node b){return (Node){a.x+b.x,a.y+b.y};}
void cmax(Node &a,Node b){a=a<b?b:a;}
void dfs(int u,int ff,ll mid)
{
f[0][u]=(Node){0,0};
f[1][u]=(Node){-mid,1};
f[2][u]=(Node){-1ll<<60,0};
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs(v,u,mid);
Node tmp=max(f[0][v],max(f[1][v],f[2][v]));
cmax(f[2][u],f[2][u]+tmp);
cmax(f[2][u],f[1][u]+f[1][v]+(Node){e[i].w+mid,-1});
cmax(f[1][u],f[1][u]+tmp);
cmax(f[1][u],f[0][u]+f[1][v]+(Node){e[i].w,0});
cmax(f[1][u],f[0][u]+f[0][v]+(Node){-mid,1});
cmax(f[0][u],f[0][u]+tmp);
}
cmax(ans,max(f[0][u],max(f[1][u],f[2][u])));
}
int main()
{
n=read();K=read()+1;
for(int i=1;i<n;++i)
{
int u=read(),v=read(),w=read();
Add(u,v,w);Add(v,u,w);sum+=abs(w);
}
ll l=-sum,r=sum;
while(l<r)
{
ll mid=(l+r)>>1;
ans=(Node){-1ll<<60,0};dfs(1,0,mid);
if(ans.y>K)l=mid+1;
else r=mid;
}
ans=(Node){-1ll<<60,0};dfs(1,0,r);
printf("%lld\n",r*K+ans.x);
return 0;
}

【BZOJ5252】林克卡特树(动态规划,凸优化)的更多相关文章

  1. [八省联考2018]林克卡特树lct——WQS二分

    [八省联考2018]林克卡特树lct 一看这种题就不是lct... 除了直径好拿分,别的都难做. 所以必须转化 突破口在于:连“0”边 对于k=0,我们求直径 k=1,对于(p,q)一定是从p出发,走 ...

  2. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

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

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

  4. P4383 [八省联考2018]林克卡特树 树形dp Wqs二分

    LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j ...

  5. luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分)

    luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分) Luogu 题解时间 $ k $ 条边权为 $ 0 $ 的边. 是的,边权为零. 转化成选正好 $ k+1 $ 条链. $ ...

  6. BZOJ5252 八省联考2018林克卡特树(动态规划+wqs二分)

    假设已经linkcut完了树,答案显然是树的直径.那么考虑这条直径在原树中是怎样的.容易想到其是由原树中恰好k+1条点不相交的链(包括单个点)拼接而成的.因为这样的链显然可以通过linkcut拼接起来 ...

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

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

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

    bzoj(上面可以下数据) luogu description 在树上选出\(k\)条点不相交的链,求最大权值. 一个点也算是一条退化的链,其权值为\(0\). sol 别问我为什么现在才写这题 首先 ...

  9. bzoj 5252: [2018多省省队联测]林克卡特树

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

随机推荐

  1. Python之元类详解

    一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...

  2. UNITY_委托和事件

    UNITY_委托和事件 参考资料: Unity3D脚本编程-使用C#语言开发跨平台游戏-陈嘉栋 观察者模式 主题(Subject)管理某些数据,当主题的数据发生改变时,会通知已经注册(Register ...

  3. linux 安装配置zookeeper脚本

    #!/bin/bash # automatic install zookeeper echo "========= Start to install zookeeper ========== ...

  4. Cocoapods更改安装版本及卸载、ruby版本检测和安装

    修改于:2017.1.10 我们实际过程中会遇到很多的问题,并且各式各样,特别是各种系统.工具版本升级后遇到的问题,最后的杀手锏就是彻底删干净,重装. 一. 移除pod组件 这条指令会告诉你Cocoa ...

  5. 20135234mqy 实验二 Java面向对象程序设计

      北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352  姓名:mqy  学号:20135234 成绩:             指导教师: ...

  6. 20162328蔡文琛 2017week03

    20162328 2017-2018-1 <程序设计与数据结构>第3周学习总结 教材学习内容总结 查找是在一组项内找到指定目标或是确定目标不存在的过程. 搞笑的查找使得比较的次数最少. C ...

  7. 今日事——Sprint计划会议

    一.   Sprint需求: 解屏提醒部分 界面设计 登录功能 备忘功能 成就系统 二.工作认领: 因有成员请假回家,所以延后认领,目前主要任务是学习如何在andriod平台开发并搭建开发环境. 网上 ...

  8. Internet History, Technology and Security (Week3)

    Week3. Welcome to week 3! This is our fourth and final week of History where we make the connection ...

  9. 旧文备份:CANopen协议中SDO服务

    SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点 ...

  10. Redis4.0模块子系统实现简述

    一.模块加载方法 1.在配置文件或者启动参数里面通过<loadmodule /path/to/mymodule.so args>指令加载 2.Redis启动后,通过<module l ...