CF1833G Ksyusha and Chinchilla
题解
知识点:贪心,树形dp。
当 \(3 \not \mid n\) 时,显然无解。
考虑一种贪心策略,从叶子节点往上只,要以当前节点为根的子树大小能被 \(3\) 整除,就立刻切除这棵子树,若最后切除次数刚好为 \(\dfrac{n}{3} - 1\) ,则有解。
考虑证明:
- 显然,若根据我们的策略成功划分,则一定满足条件,即有解。
- 若不满足,则一定存在一个子树除掉满足我们策略的部分后,仍然剩余 \(>3\) 个节点,此时子树的每个子树深度不会超过 \(2\) ,且一定没有分叉,是无法进行任何切割的,因此无解。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#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;
}
CF1833G Ksyusha and Chinchilla的更多相关文章
- KMP算法实践与简单分析
一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...
- ChatGPT 背后的“功臣”——RLHF 技术详解
OpenAI 推出的 ChatGPT 对话模型掀起了新的 AI 热潮,它面对多种多样的问题对答如流,似乎已经打破了机器和人的边界.这一工作的背后是大型语言模型 (Large Language Mode ...
随机推荐
- 第65篇 AJAX初识 校验用户名 登录示例 文件上传 csrftoken
1, 知识储备 2. AJAX的定义 异步的JavaScript和XML 使用场景: JavaScript和后端的数据传递 2.1原生的JavaScript实现AJAX 2.2 JQuery实现 2. ...
- APB Slave Design
APB Slave Design module apb_slave #( REG1_ADDR = 8'h00, REG2_ADDR = 8'h04, REG3_ADDR = 8'h08 ) ( // ...
- 如何让Dec-C++支持C++11
1.问题 Dev-C++默认设置中是不支持C++11版本特性的,如Lambda表达式,nullptr等均不提供支持 2.解决 设置编译选项 编译时加上命令-std==c++11即可
- QT启动问题--找不到python36.dll-cnblog
1.报错:找不到python36.dll 2.解决 通过该查询CSDN下载相应的python36.dll放到C:\Windows\System32目录下即可 https://blog.csdn.net ...
- VS中多个源文件中只运行其中特定文件
1.问题 有时候一个项目中创建了多个源文件,但是我只想运行其中的一个,一起运行就会出现多个main入口的问题 2.解决方式 2.1 右键要排除的文件,点击属性 2.2 从生成中排除一项中选择是即可 2 ...
- Go-单链表-栈和队列
package main import ( "errors" "fmt" "log" ) // 单链表 // 特征: // 1. 每个节点都 ...
- 使用Java分析器优化代码性能,解决OOM问题
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 背景 最近我一直在做性能优化,对一个单机应用做性能优化.主要是 ...
- [转帖]Java连接 MySQL详细教程,分享复习经验和后台开发面经
(由于安装了汉化包,英文版的用户可以对应图标来操作) 选中菜单栏文件,之后选择项目结构 选择Libraries 点击+ ![在这里插入图片描述](https://img-blog.csdnimg.cn ...
- vue报错:'XX' is defined but never used no-unused-vars
参考地址:http://www.gold404.cn/info/87 导致这个报错的原因就是eslint校验, 就是你当初在vue创建脚手架的时候选择了eslint校验: 后面你绝对会碰到这样的报错, ...
- c#时间格式转换汉字大写
把时间转换为汉字大写 public class DateTimeConvert { public static string ConvertToChineseCapital(DateTime date ...