CF1833G Ksyusha and Chinchilla
题解
知识点:贪心,树形dp。
当 时,显然无解。
考虑一种贪心策略,从叶子节点往上只,要以当前节点为根的子树大小能被 整除,就立刻切除这棵子树,若最后切除次数刚好为 ,则有解。
考虑证明:
- 显然,若根据我们的策略成功划分,则一定满足条件,即有解。
- 若不满足,则一定存在一个子树除掉满足我们策略的部分后,仍然剩余 个节点,此时子树的每个子树深度不会超过 ,且一定没有分叉,是无法进行任何切割的,因此无解。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<pair<int, int>> g[200007]; int sz[200007]; vector<int> ans; void dfs(int u, int fa) { sz[u] = 1; for (auto [v, id] : g[u]) { if (v == fa) continue; dfs(v, u); sz[u] += sz[v]; if (sz[v] % 3 == 0) ans.push_back(id); } } bool solve() { int n; cin >> n; ans.clear(); for (int i = 1;i <= n;i++) g[i].clear(); for (int i = 1;i <= n - 1;i++) { int u, v; cin >> u >> v; g[u].push_back({ v,i }); g[v].push_back({ u,i }); } if (n % 3) return false; dfs(1, 0); if (ans.size() != n / 3 - 1) return false; cout << n / 3 - 1 << '\n'; for (auto id : ans) cout << id << ' '; cout << '\n'; return true; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { if (!solve()) cout << -1 << '\n'; } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/17688834.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具