当前位置: 首页 > news >正文

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

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.zskr.cn/news/48506.html

相关文章:

  • 软件开发公司的隐形资产:为什么设计思维比代码量更值钱?
  • 2025年平移门行业十大服务商权威推荐榜单:专业选择指南
  • 2025年不锈钢列管式冷凝器源头厂家权威推荐榜单:化工冷凝器/新型风冷冷凝器/不锈钢冷凝器源头厂家精选
  • 一阶矩估计
  • 区间与除法-线段树
  • 足球
  • 新建 Microsoft Word 文档
  • 2025 年 11 月污水提升泵厂家推荐排行榜,进口污水提升泵,地下室家用污水提升泵,别墅/厕所/卫生间马桶污水提升泵,厨房墙排一体化污水提升泵公司推荐
  • 2025年硅晶釉涂料优质厂家权威推荐榜单:硅晶釉/釉面涂料/隔热涂料源头厂家精选
  • 2025年矿用设备设施安全检测检验企业口碑排行榜
  • adb gdb+gdbserver远程调试ddsrouter
  • A4纸打印标签
  • TIA Portal 最新正式版本是 V20
  • Python 集合Set简介
  • 算力赋能场景:RK主板的技术演进与行业应用全景
  • 2025年RS485噪声监测仪定做厂家权威推荐榜单:噪声检测仪/工业声音传感器/噪声检测传感器源头厂家精选
  • 2025年11月重庆眼镜店最新推荐,覆盖青少年配眼镜/儿童配眼镜/老年人配眼镜/全人群配镜需求
  • 吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(六)课后习题和代码实践
  • 2025年北京物业合作公司权威推荐榜单:医院物业加盟/学校物业加盟/物业加盟合作伙伴精选
  • How to make your GCC kawaii in Dev-C++
  • 2025年工业制冷品牌推荐排行榜:专业评测与选择指南
  • 2025超级简单jenkins部署!保姆级教学!
  • 闭包装饰器
  • 2025年11月国内画册设计企业综合推荐排行榜
  • 微算法科技(NASDAQ MLGO)通过容量证明(PoC)构建全球存储资源池,为Web3应用提供低成本、抗审查的数据存储服务
  • UI自动化维护成本高?一个Dify工作流,实现自愈式测试,告别脚本脆弱性
  • window 系统之AMD 和 ARM区别
  • 成熟可靠的多层级全景式教育行业数据安全管理方案
  • 对接世界职业院校技能大赛标准,唯众打造高质量云计算实训室 - 教程
  • 2025年pc防火改性塑料定制厂家权威推荐榜单:耐寒改性pc/pc改性工艺/PC温度改性源头厂家精选