P4383 [八省联考 2018] 林克卡特树

news/2024/11/5 14:36:25/文章来源:https://www.cnblogs.com/summ1t/p/18527828

简化题意,给一棵树,找出恰好 \(k+1\) 条链,是这些链之和最大。

有恰好选出的字眼,并且原问题显然具有凸性,直接考虑 wqs 二分。

然后每条链会减去二分的 \(mid\),然后没有限制,求最大链和及链的数量,考虑树形 dp。

\(f_{x,0/1/2}\) 表示以 \(x\) 为根的子树,\(x\) 点入度为 \(0/1/2\) 所得的最大链值。

特别地,每次转移完 \(x\) 后令 \(f_{x,0}=\max(f_{x,0},f_{x,1}+mid,f_{x,2})\),表示 \(x\) 不再和祖先进行链的合并,此时得到的最优解。

接下来就能转移了,设 \(y\)\(x\) 的儿子,转移分三步:

\(f_{x,2}=\max(f_{x,2}+f_{y,0},f_{x,1}+f_{y,1}+w_{(x,y)}+mid)\)

\(f_{x,1}=\max(f_{x,1}+f_{y,0},f_{x,0}+f_{y,1}+w_{(x,y)})\)

\(f_{x,0}=\max(f_{x,0}+f_{y,0})\)

最后判断链数和 \(k\) 的大小关系,就做完了。

注意边权相等时,链数少的状态优先转移,因为维护的是上凸包。

#include<bits/stdc++.h>
using namespace std;
#define rd read()
#define ll long long
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define ROF(i,j,k) for(int i=j;i>=k;i--)
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;
}
const int N=3e5+10;
const ll INF=1e12;
int n,k,head[N],tot;
struct node{int to,nxt,w;}edge[N<<1];
void add(int x,int y,int w){edge[++tot]={y,head[x],w};head[x]=tot;}
struct Node{ll val;int cnt;Node(ll x=0,int y=0):val(x),cnt(y){}friend bool operator<(Node a,Node b){return a.val!=b.val?a.val<b.val:a.cnt>b.cnt;}friend Node operator+(Node a,Node b){return Node{a.val+b.val,a.cnt+b.cnt};}friend Node operator+(Node a,ll v){return Node{a.val+v,a.cnt};}
}f[N][3],tmp;
void dfs(int x,int fa){f[x][0]=f[x][1]=f[x][2]=Node();f[x][2]=max(f[x][2],tmp);for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(y==fa) continue;dfs(y,x);f[x][2]=max(f[x][2],max(f[x][2]+f[y][0],f[x][1]+f[y][1]+edge[i].w+tmp));f[x][1]=max(f[x][1],max(f[x][1]+f[y][0],f[x][0]+f[y][1]+edge[i].w));f[x][0]=max(f[x][0],f[x][0]+f[y][0]);}f[x][0]=max(f[x][0],max(f[x][1]+tmp,f[x][2]));
}
int main(){n=rd,k=rd,k++;FOR(i,1,n-1){int x=rd,y=rd,w=rd;add(x,y,w),add(y,x,w);}ll l=-INF,r=INF,ans=0 ;while(l<r){ll mid=(l+r+1)/2ll;tmp=Node{-mid,1};dfs(1,0);if(f[1][0].cnt==k){printf("%lld\n",f[1][0].val+k*mid);return 0;}if(f[1][0].cnt>k) l=mid+1;else r=mid;}tmp=Node{-l,1};dfs(1,0),printf("%lld\n",f[1][0].val+k*l);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827148.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件设计布线原则

1. 高速电流不应流经低速器件 高速电路的地返回信号也会造成地平面的电压发生变 化。对于地平面或接地走线的感抗,V = Ldi/dt ;对于地平面或接地走线的阻抗,V = RI 。与数字电流一样,高 速电路的地平面或接地走线经过模拟器件时,地线上的电压变化会改变信 号链中信号和地之…

11.9

[实验任务一]:女娲造人 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。 实验要求:画出对应的类图;提交源代码;package uml;// Per…

IT监控(进阶篇):运维监控系统手把手部署教学

前言: 注:系统需必须是centos7.4-7.9或redhat7.4-7.9且无其他业务的,不存在nginx、php、mysql、perseusZ_server、ansibles、postgresql等软件,否则一些脚本探测到已安装则会跳过配置文件的修改导致后续安装的系统功能异常。 top #查看系统配置最低要求CPU8核心以上,内存8…

RocketMQ实现优惠券秒杀

RocketMQ实现优惠券秒杀的简单思路秒杀架构图准备数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for goods -- ---------------------------- DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` (`id` int(11…

2024.11.5 人工智能在小学教育教学中的应用

【知识小课堂1】概念与历史 人工智能(Artificial Intelligence),引文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 (一)学科范畴 人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。 (二)涉及…

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: • 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…

11.5 人工智能学习内容

人工智能(Artificial Intel ligence) 引文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 (一)学科范畴 人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。 (二)涉及学科与领域 哲学和认…

Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解

title: Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解 date: 2024/11/5 updated: 2024/11/5 author: cmdragon excerpt: nitro:build:public-assets 是 Nuxt 3 中的一个生命周期钩子,在复制公共资产之后调用。该钩子使开发者能够在构建 Nitro 服务器之前,对公…

FB284功能说明

FB284功能说明带增量编码器V90,使用参考挡块+编码器零脉冲方式回零时,参考挡块回零开关接到哪里,怎样配置 回零开关连接到一个PLC的数字量输入点,PLC内编程将其状态关联到FB284功能块ConfigEPos输入引脚的bit6。 (1)将V90参数P29240设置为1(选择参考挡块+零脉冲方式回零)…

《图解设计模式》 第九部分 避免浪费

第二十章 Flyweight 模式public class BigcharFactory{//这里对使用到的内容进行了缓存private HashMap pool = new HashMap();//有则直接取,无则创建并保存到缓存。public synchronized BigChar getBigChar(char charname){BigChar bc = (BigChar) pool.get("" + c…

黑马PM-电商项目-订单管理

支付管理订单管理订单统计评价管理