树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。

先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。

注:参考过网上零散题解。

题意很好理解,我们就不过多叙述了。

不看炸掉的机子,我们实际上是在选择一个联通块去覆盖树的一部分,而我们所要求的就是这个联通块的最大值。

我们统一在这个联通快的最高点进行答案的统计,从子树的贡献向上递归,这个样子问题可以从子树中合并上来,进而考虑树形 dp。

\(dp[u]\) 表示联通块的最高点还在祖先处时 \(u\) 子树中的答案,形象的说,就是上不封顶。

这个时候我们只要选择了 \(u\) 子树中的发电机 \(u\) 自然会炸,因为最高点在祖先,上边会有其他启动的发电机。

所以我们一共有两种决策:选择所有子树中的最佳情况或者干脆不选子树,去选 \(u\) 上的发电机。

注意如果没有发电机便只有第一种情况。

明显不存在其他情况。

转移于是乎就明显起来了,我们在 \(\sum_{v\in son[u]} dp[v]-1\)\(1\) 之间取最大就是 \(dp[u]\) 了。

这个式子对应了我们上边说的两种情况,下边说说答案的统计。

我们规定了在最高点统计答案,每个点都可以是最高点,对于一个最高点,若不想让这个点炸只能选择一个子树中的答案,若允许它炸就直接选择所有子树中的答案再让它炸,第二种和 \(dp[u]\) 最终的结果应该是相等的,但是含义并不一样,后边为了方便写在一起了。

代码如下,这个题想起来有些麻烦但实现起来就很轻松。

#include <bits/stdc++.h>
using namespace std;
const int MN=1e6+116;
struct Node{int nxt, to;
}node[MN];
int head[MN], tottt;
void insert(int u, int v){node[++tottt].to=v;node[tottt].nxt=head[u];head[u]=tottt; return;
}
//以上是平平无奇的存图
int n, dp[MN], has[MN], ans=0;//has表示介个点有没有发电机
void Read(){memset(dp,0,sizeof(dp)); memset(has,false,sizeof(dp));cin>>n;for(int i=1,u,v; i<n; ++i){cin>>u>>v; insert(u,v); insert(v,u);}string s; cin>>s; s=' '+s;for(int i=1; i<=n; ++i){if(s[i]=='1') has[i]=true;}
}
void dfs(int u, int father){for(int i=head[u];i;i=node[i].nxt){int v=node[i].to;if(v==father) continue;dfs(v,u); dp[u]+=dp[v];ans=max(ans,dp[v]+(has[u]));//最高点不炸,选择一棵子树}if(has[u]) dp[u]=max(dp[u]-1,1);ans=max(ans,dp[u]);//最高点可炸
}
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);Read(); dfs(1,1); cout<<ans<<'\n';return 0;
}

若有不足请告诉我,谢谢啦。

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

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

相关文章

深入解析:灵画-AI绘画小程序

深入解析:灵画-AI绘画小程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

AT_arc156_b [ARC156B] Mex on Blackboard

首先枚举你花 \(i\) 次操作可以搞到的最大值是什么,然后你剩下的集合就随便取,只要取不超过 \(k - i\) 个即可,用插板法很容易做。

实用指南:CAN邮箱深度解析:从硬件架构到实战应用

实用指南:CAN邮箱深度解析:从硬件架构到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

产品排序

考虑区间 $dp$。设 $f_{i,j}$ 表示处理 $[i,j]$ 最小的总惩罚值。分类: - 产品 $i$ 第一个出栈,则有 $f_{i,j}=t_i\times sd_{i,j}+f_{i+1,j}$ - 产品 $i$ 第 $k$ 个出栈,则有 $f_{i,j}=f_{i+1,k}+f_{k + 1,j}+st_{…

众包网站开发网站建设录哪个科目

先拆成链的情况来看。 设B[i]表示i要向i1拿糖果的数量&#xff0c;C为平均数&#xff0c;则B[i] C - A[i] B[i-1] Answer就是B的绝对值之和 现在来看环的情况&#xff0c;也就是说B[n]指的是n要向1拿糖果的数量。不妨设B[n]为K&#xff0c;则B[1] C - A[1] K………… 照着式…

云阳一平米网站建设打开百度网页

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

环形链表II-leetcode

题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系…

ubuntu20.04安装nvidia显卡

24.04内核最新升级6.14.0,但是会出现英伟达驱动问题,现有的版本是6.8 重新安装了ubuntu20.04 先检查可用驱动:ubuntu-drivers devices下面会显示推荐安装的驱动版本,因为我原先的版本太低了,导致ubuntu内核更新一…

搬瓦工的主机可以用来做网站吗如何自己做加盟网站

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…

[线段树系列 #6] 标记永久化

[线段树系列 #6] 标记永久化 标记永久化是线段树的一个技巧,通常用于对主席树等难以 pushdown 的数据结构进行区间修改 具体思想已经体现在名字里了,我们结合例题稍微讲解一下 例题1 P3372 【模板】线段树 1 线段树区…

c语言switch和if语句

c语言switch和if语句c语言中switch和if语句 #include <stdio.h>int main(){int category = 2;float price = 299.9;switch (category){case 1 :if (price < 500){printf("电子产品价格较低,无优惠\n&qu…

Qt(制作一个方便的文本编辑器)

Qt(制作一个方便的文本编辑器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

购买网站空间后怎么做海南省官网

path_provider获取应用存储路径path_provider是flutter提供的一个获取应用存储路径的插件&#xff0c;它封装了统一的api来获取Android和ios两个平台的应用存储路径&#xff0c;提供的api如下&#xff1a;getTemporaryDirectory()&#xff1a;获取应用临时文件夹&#xff0c;该…

长沙建设工程造价网站wordpress连接服务器配置

戳“在看”一起来充电吧!C语言的那些经典程序 第十四期本期小C给大家带来三个用C语言解决实际问题的典例。如果全都理解&#xff0c;相信肯定能给大家带来收获&#xff01;接下来让我们看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;运行结果&#xff1a;程序分析:该…

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析DeepSeek-V3.2-Exp是DeepSeek AI于2025年9月29日发布的实验性大语言模型,标志着该公司在AI架构创新方面的重要里程碑。作为V3.1-Terminus的升级…

Java EE初阶启程记05---线程安全 - 指南

Java EE初阶启程记05---线程安全 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

查域名优化方案2022

简介 上篇文章已经介绍了数据类型&#xff0c;如INTERGER TYPE、BITMASK TYPE、STRING TYPE、LINK LAYER ADDRESS TYPE、 IPV4 ADDRESS TYPE、 IPV6 ADDRESS TYPE、BOOLEAN TYPE、ICMP TYPE、CONNTRACK TYPES等。那么本篇文章主要介绍PRIMARY表达式的相关内容。 PRIMARY EXPR…

tldr的安装与利用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站内容授权书下列关于网站开发中网友上传

基于matlab的结构有限元分析。包括基于4节点四面体单元的空间块体分析、基于4节点四边形单元的矩形薄板分析、基于3节点三角形单元的矩形薄板分析、三梁平面框架结构的有限元分析、四杆桁架结构的有限元分析、基于8节点六面体单元的空间块体分析。每个程序都要相应的文档说明。…

DataGridView表格控件使用说明

可以添加和编辑列设置头部设置列的样子:设置高度 ,需要多个属性配合使用完全居中 ,每个列都需要进行设置效果展示:数据绑定 先设置属性public class SysAlarm{public string AlarmTime { get; set; }public string…