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

Luogu

题解时间

$ k $ 条边权为 $ 0 $ 的边。

是的,边权为零。

转化成选正好 $ k+1 $ 条链。

$ k \le 100 $ 的部分。

毫无疑问是树上打背包dp。

但具体设计还要注意一下。

一个问题是单点成链,这个要特判。

之后由于选择的都是链,所以每个点的度数不会超过2.

这样方程就出来了。

$ k \le n $ 的部分。

很明显不能背包了。

但“选正好k个求最大权值和”这个要求如果熟悉的话可能想到wqs二分。

打表试一下发现确实是上凸函数。

之后就按wqs二分的套路来,二分加权mid,求 $ dp_{x,k,deg} - mid * k $ 就完事了。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=300011;
const int inf=0x3f3f3f3f;
const lint linf=0x3f3f3f3f3f3f3f;
struct sumireko{int to,ne;lint w;}e[N<<1];int he[N],ecnt;
void addline(int f,int t,lint w){e[++ecnt].to=t,e[ecnt].w=w;e[ecnt].ne=he[f],he[f]=ecnt;}
struct pat
{
lint v,k;pat(lint v=-linf,lint k=inf):v(v),k(k){}
bool operator<(const pat &p)const{return v==p.v?k>p.k:v<p.v;}
pat friend operator+(const pat &pa,const pat &pb){return pat(pa.v+pb.v,pa.k+pb.k);}
}dp[N][3],dg[3],dtmp; int n,kap;lint km;
void dfs(int x,int f)
{
for(int i=he[x],t=e[i].to,w=e[i].w;i;i=e[i].ne,t=e[i].to,w=e[i].w)if(t!=f)
{
dfs(t,x);for(int p=0;p<3;p++) dg[p]=pat();
for(int j=0;j<3;j++)for(int p=0;p<3;p++) dg[j]=max(dg[j],dp[x][j]+dp[t][p]);
dg[1]=max(dg[1],dp[x][0]+max(dp[t][0]+pat(w-km,1),dp[t][1]+pat(w,0)));
dg[2]=max(dg[2],dp[x][1]+max(dp[t][0]+pat(w,0),dp[t][1]+pat(w+km,-1)));
memcpy(dp[x],dg,sizeof(dg));
}
}
void dpclr(){for(int i=1;i<=n;i++) dp[i][0]=pat(0,0),dp[i][1]=pat(),dp[i][2]=pat(-km,1);} int main()
{
#ifdef RDEBUG
freopen("sample.in","r",stdin);
#endif
read(n),read(kap),kap++;for(int i=2,x,y,w;i<=n;i++) read(x),read(y),read(w),addline(x,y,w),addline(y,x,w);
lint ql=-1e8,qr=1e8,qm,qa;
while(ql<=qr)
{
qm=ql+qr>>1,km=qm;
dpclr(),dfs(1,0),dtmp=max(dp[1][0],max(dp[1][1],dp[1][2]));
if(dtmp.k==kap){printf("%lld\n",dtmp.v+km*kap);return 0;}
else if(dtmp.k>kap) ql=qm+1;
else qr=qm-1,qa=qm;
}
km=qa;
dpclr(),dfs(1,0),dtmp=max(dp[1][0],max(dp[1][1],dp[1][2]));
printf("%lld\n",dtmp.v+km*kap);
return 0;
}
}
int main(){return RKK::main();}

luoguP4383 [八省联考2018]林克卡特树(树上dp,wqs二分)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    题解: zhcs的那个题基本上就是抄这个题的,不过背包的分数变成了70分.. 不过得分开来写..因为两个数组不能同时满足 背包的话就是 $f[i][j][0/1]$表示考虑i子树,取j条链,能不能向上 ...

  7. 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分

    题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...

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

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

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

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

随机推荐

  1. 抓取并解密HTTPS流量

    WireShark   Wireshark解密TLS数据流,从网上已有资料来看,主要是两种方式:一是服务端私钥直接解密,二是使用SSLKEYLOGFILE获取握手过程中的会话密钥信息进行解密.   这 ...

  2. Dump Lsass内存转储新旧方法

      之前看到一篇关于Lsass内存dump的文章,学习记录一下.   lsass.exe(Local Security Authority Subsystem Service)进程空间中,存有着机器的 ...

  3. 原来VIM还可以这样玩

    文章目录 配置文件vimrc vim 状态栏 状态栏配置内容 状态栏常用信息 显示状态栏 终端安全色 vimrc 配置文件 推荐 vi/vim命令大全 vim参阅 配置文件vimrc 在vim文件中执 ...

  4. 利用iptables做网络转发

    常见的网络拓扑图结构如下: 但是内网服务器偶尔有上网需求,比如yum工具,wget文件.而我们又不能让重要业务直接暴露在公网上. 好用的安全策略有:三层交换机.路由器做nat映射,防火墙做安全策略. ...

  5. 如何基于gRPC沟通微服务框架

    本文我们来讲解一下如何使用 gRPC构建微服务,gRPC是一个开源框架,可用于构建可扩展且高性能的微服务并创建服务之间的通信. 背景 随着企业越来越多地转向微服务,对构建这些微服务的低延迟和可扩展框架 ...

  6. Windows server 2016 2019远程端口修改操作

    windows server 2016 2019修改远程端口操作   一.修改3389远程端口 1,按"win+r"快捷键,在对话框中输入regedit 2, 找到路径 \HKEY ...

  7. 【C# 反射】使用 Activator 类 -激活器

    创建类的实例: //需要添加对Education.dll的引用才能正确执行 object CreateInstanceKind1 = Activator.CreateInstance("Ed ...

  8. 【C#表达式树 开篇】 Expression Tree - 动态语言

    .NET 3.5中新增的表达式树(Expression Tree)特性,第一次在.NET平台中引入了"逻辑即数据"的概念.也就是说,我们可以在代码里使用高级语言的形式编写一段逻辑, ...

  9. mysql 语句的使用

    查看数据库 show databases; use 数据库名: show tables; //显示数据库的表名describe 表名; //显示某表的字段, 建表模板 这是为了清楚直观,再mysql行 ...

  10. Go切片全解析

    Go切片全解析 目录结构: 数组 切片 底层结构 创建 普通声明 make方式 截取 边界问题 追加 拓展表达式 扩容机制 切片传递的坑 切片的拷贝 浅拷贝 深拷贝 数组 var n [4]int f ...