Codeforces 1120D Power Tree 题解 [ 蓝 ] [ 树形 DP ] [ 记忆化搜索 ] [ 图论建模 ] [ 最小生成树 ] [ 差分 ]

news/2025/11/13 15:31:02/文章来源:https://www.cnblogs.com/zhr0102/p/19218314

Power Tree

简单题,场上大概写了 50min。

Sol.1 树形 DP

对所有数变 \(0\) 的条件进行刻画,把子树的条件画在序列上。具体而言,我们求出树的中序遍历,选择一个节点等价于将其子树的区间 \([l, r]\) 分离出来,即在 \(l - 1, l\) 之间与 \(r, r+1\) 之间加一个隔板。那么一个方案的叶子能变成 \(0\),当且仅当同时满足下列两个条件:

  • 每一段内不超过 \(1\) 个叶子。
  • 每个叶子必须被覆盖过一次。

注意到如果一颗子树内已经存在一段有 \(\ge 2\) 个叶子,则往祖先方向走一定无法使得方案合法。因为祖先的区间一定是包含自己的区间的,因此隔板没有办法放在这颗子树内的区间。

由此可以得出一个结论:一颗子树内最多存在一个未被覆盖的节点

由此可以设计 DP:\(dp_{i, 0/1}\) 表示在 \(i\) 的子树内,存在 \(0/1\) 个未被覆盖的节点的最小花费。转移即可:

  • \(dp_{i, 0}\gets\min\{\sum dp_{v, 0}, dp_{j, 1} + a_i+\sum_{v\ne j}dp_{v, 0}\}\)
  • \(dp_{i, 1}\gets \min\{dp_{j, 1} + \sum_{v\ne j}dp_{v, 0}\}\)

考虑构造方案。我们自顶向下构造,判断从某个状态能否推到后面的状态。如果可以,继续递归构造。如果直接这样模拟是 \(O(n^2)\) 的。但是你发现有很多次递归构造都是重复的,因此对每个节点递归构造的次数记录一下,记忆化搜索式地完成构造即可。

时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using pi = pair<int, int>;
typedef long long ll;
const int N = 200005;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n;
ll a[N];
vector<int> g[N];
ll dp[N][2], sm[N], ans;
bitset<N> res;
void dfs(int u, int fa)
{if(g[u].size() == 1 && fa != 0){dp[u][0] = a[u];dp[u][1] = 0;return;}ll tmp = 0;for(auto v : g[u]){if(v == fa) continue;dfs(v, u);tmp += dp[v][0];}sm[u] = tmp;dp[u][0] = min(dp[u][0], tmp);for(auto v : g[u]){if(v == fa) continue;dp[u][0] = min(dp[u][0], tmp - dp[v][0] + dp[v][1] + a[u]);dp[u][1] = min(dp[u][1], tmp - dp[v][0] + dp[v][1]);}
}
bitset<2> vis[N];
void dfs2(int u, int fa, int typ)
{if(vis[u][typ]) return;vis[u][typ] = 1;ll pans = dp[u][typ];if(g[u].size() == 1 && fa != 0){if(typ == 0) res[u] = 1;return;}if(typ == 0){if(sm[u] == pans){for(auto v : g[u]){if(v == fa) continue;dfs2(v, u, 0);}}int premx = -1, sufmn = 0x3f3f3f3f;for(int i = 0; i < g[u].size(); i++){int v = g[u][i];if(v == fa) continue;if(sm[u] - dp[v][0] + dp[v][1] + a[u] == pans){res[u] = 1;dfs2(v, u, 1);premx = max(premx, i);sufmn = min(sufmn, i);}}for(int i = 0; i < g[u].size(); i++){int v = g[u][i];if(v == fa) continue;if(i >= premx) break;dfs2(v, u, 0);}for(int i = g[u].size() - 1; i >= 0; i--){int v = g[u][i];if(v == fa) continue;if(i <= sufmn) break;dfs2(v, u, 0);}return;}int premx = -1, sufmn = 0x3f3f3f3f;for(int i = 0; i < g[u].size(); i++){int v = g[u][i];if(v == fa) continue;if(sm[u] - dp[v][0] + dp[v][1] == pans){dfs2(v, u, 1);premx = max(premx, i);sufmn = min(sufmn, i);}}for(int i = 0; i < g[u].size(); i++){int v = g[u][i];if(v == fa) continue;if(i >= premx) break;dfs2(v, u, 0);}for(int i = g[u].size() - 1; i >= 0; i--){int v = g[u][i];if(v == fa) continue;if(i <= sufmn) break;dfs2(v, u, 0);}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i < n; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}memset(dp, 0x3f, sizeof(dp));dfs(1, 0);ans = dp[1][0];dfs2(1, 0, 0);int anscnt = 0;for(int i = 1; i <= n; i++) anscnt += res[i];cout << ans << " " << anscnt << "\n";for(int i = 1; i <= n; i++)if(res[i])cout << i << " ";return 0;
}

Sol.2 最小生成树

图论建模。把树拍成 DFS 序,把每个子树的区间 \([l, r]\) 表示在序列上区间加,通过差分发现这等价于在 \(l\)\(+v\),在 \(r+1\)\(-v\)

最后的目标是要把所有位置的值全部丢给 \(\bm{n + 1}\),相当于是问使得 \(1\sim n + 1\) 连通的最小花费。直接求 MST 即可。

构造方案也是经典的,考虑 Kruskal 的过程,发现我们把比某条边权值小的边全部加入,判断这条边能否成为 MST 树边即可。这个可以在求 MST 的过程中一次实现。

时间复杂度 \(O(n\log n)\)。代码没写。

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

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

相关文章

软件开发公司的隐形资产:为什么设计思维比代码量更值钱?

软件开发公司的隐形资产:为什么设计思维比代码量更值钱?代码量陷阱:软件开发的认知误区 在软件开发行业,“代码量”曾长期被当作衡量开发能力与项目价值的硬指标。不少企业将日均代码行数、功能模块数量作为考核标…

mybatis 打印执行SQL

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import lombok.extern.slf4j.Slf4j; imp…

10年湛江老导游私藏路线!除了生蚝,这座海滨之城还有多少惊喜等你发现

各位旅友,大家好! 我是导游小胡,在湛江这座美丽的海滨城市已经做了整整10年导游。今天,我想带大家看看,除了远近闻名的湛江生蚝,这座城市还有哪些让人流连忘返的风景。 湖光岩:世界地质奇观的秘密 作为世界第二…

ld.lld: error: undefined symbol: _impure_ptr 出现该问题解决办法

ld.lld: error: undefined symbol: _impure_ptr 出现该问题解决办法 解决方案命令 方法1:显式链接newlib gcc -specs=nosys.specs your_source.c -o output方法2:使用完整newlib gcc --specs=rdimon.specs -lrdimon …

5、MySQL 常用值

MySQL 常用值清单,涵盖了实际开发中最频繁使用的默认值、函数和属性。 一、自动编号与唯一标识 值/属性说明使用场景示例AUTO_INCREMENT 自动生成唯一递增整数 id INT AUTO_INCREMENT PRIMARY KEYUUID() 生成全局唯一…

2025年平移门行业十大服务商权威推荐榜单:专业选择指南

文章摘要 随着智能出入管理需求的持续增长,2025年平移门行业迎来新一轮技术革新与市场洗牌。本文基于行业数据与用户口碑,深度解析当前市场上十大平移门服务商的综合实力,为企事业单位提供权威参考。文末附专业选购…

2025年平移门服务商综合实力排行榜:十大优质企业深度解析

摘要 随着智能建筑和安防需求的不断提升,平移门行业在2025年迎来了新一轮发展机遇。本文基于市场调研数据、用户口碑评价和技术实力分析,为您呈现当前国内平移门服务商的综合排名。本排名旨在为有平移门采购需求的用…

气象数值预报高性能计算

气象数值预报高性能计算 参考:https://www.pianshen.com/article/55351864263/

北京婚姻诉讼律师精选推荐

面对婚姻诉讼,选择一位专业资深的律师是保障自身权益的关键一步。 当婚姻走向终点,复杂的法律程序、财产分割和子女抚养问题往往让人倍感压力。在北京这样的大都市,婚姻案件不仅数量庞大,而且涉及高净值财产、跨境…

使用性能监视器,收集硬件使用记录、自定义CPU 内存 网卡等使用历史记录

使用性能监视器 这是Windows自带的、最强大的性能历史记录工具。 1. 创建数据收集器集(用于记录历史数据)按 Win + R,输入 perfmon 并回车,打开“性能监视器”。在左侧窗格中,展开 “数据收集器集” -> “用户…

基于ComfyUI的Wan2.2文生视频显卡性能实测

我们就基于ComfyUI的预置工作流模板来测试Wan2.2的模型在3090和4090两张显卡下文生视频的效率。 我们写一个Python脚本来调用ComfyUI的API,通过工作流自动生成视频,并通过多次调用取平均的方式来统计比较3090和4090执…

2025年不锈钢列管式冷凝器源头厂家权威推荐榜单:化工冷凝器/新型风冷冷凝器/不锈钢冷凝器源头厂家精选

在化工流程工业持续升级的背景下,不锈钢列管式冷凝器以其优异的耐腐蚀性能和稳定的换热效率,正成为众多企业工艺升级的首选设备。 不锈钢列管式冷凝器作为化工生产中的关键换热设备,其市场需求与化工行业固定资产投…

10年恩施老导游小胡吐血整理!这5个景点不去等于白来,内含独家避坑指南

各位旅友,大家好! 我是小胡,在恩施这片美丽的土地上做了整整10年导游。今天想和大家聊聊,除了网红打卡点,恩施还有哪些值得细细品味的地方。恩施大峡谷:地球的年轮书第一次来大峡谷的游客,总会对着"一炷香…

一阶矩估计

一阶矩估计(First Moment Estimation)在统计学和机器学习中通常指的是使用样本的一阶原点矩(即样本均值)来估计总体的一阶原点矩(即总体均值或其他依赖于它的参数)。 这是一种基于**矩估计方法(Method of Momen…

P13544 [OOI 2022] Serious Business

P13544 [OOI 2022] Serious Business 题目 Dima 参加了好友 Peter 举办的节目《Peter 帮兄弟找工作》。在这个节目中,Dima 需要穿越一个 \(3 \times n\) 的矩形场地,场地共有 \(3\) 行 \(n\) 列。每行的格子从左到右…

区间与除法-线段树

P5629-区间与除法-线段树 题意 给定 \(n\) 个数,如果可以通过除以给定的 \(d\) 得到 \(m\) 个原数中的一个,则称为可消除的,每次询问区间 \(l\) , \(r\) 中消除所有可消除的数所需的最少原数个数。写题ing 要不是…

CF1799F Halve or Subtract

首先如果一个数要搞两次操作一定是先除后减。 从大往小排序,枚举到底多少个数使用了两次操作,你发现剩下的数,令第一个 \(\ge b\) 的点为 \(p\),那么一定是一段除 + 一段减 + 一段除,且一段减必定包含 \(p\),我们…

Agent使用

目录Agent使用关键类:InstrumentationInstrumentation 的主要功能Java Agent 技术的核心意义:使用规则规则总结:标准目录结构Agent实现热更Agent 使用示例Agent 类示例Maven 配置打包后测试检查 JAR 包配置测试 pre…

利用Java反射绕过Minecraft模组限制的技术解析

本文详细介绍了如何利用Java反射技术绕过Minecraft模组的用户验证机制。通过覆盖内存中的方法调用,实现在不修改原始代码的情况下注入授权UUID,无需代理网络流量或连接互联网即可突破限制。Minecraft模组后续:Java反…

足球

3:1,拿下