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 ...
随机推荐
- [AGC058C] Planar Tree 题解
前言 赛时没做出来,赛后把题补了.果然是 maroonrk 出的,名不虚传啊--真的很好的一道题目. 解法 题目中的圆周有以下几个性质: 圆周上如果有相邻的等值,我们可以去掉一个而不改变答案(这个很好 ...
- Go socket 编程源码解析(上)
0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...
- docker 原理之 namespace (上)
1. namespace 资源隔离 namespace 是内核实现的一种资源隔离技术,docker 使用 namespace 实现了资源隔离. Liunx 内核提供 6 种 namespace 隔离的 ...
- 使用ensp搭建路由拓扑,并使用BGP协议实现网络互通实操
转载请注明出处: 1.使用ENSP搭建的网络拓扑如下: 数据准备: 设备名称 接口 IP地址 DeviceA Loopback 0 1.1.1.1/32 Eth 1/0/0 172.16.0.1/16 ...
- 基于java+springboot的商城网站、电子商城管理系统
该系统是基于java+springboot+vue开发的在线商城网站.是给师弟开发的课程作业.学习过程中,遇到问题可以咨询作者. 演示地址 前台地址: http://shop.gitapp.cn 后台 ...
- ASIC 功能验证VTB
目标 设计流程 验证设计文档和RTL code之间的关系 RTL code(DUT) - 可以当作是一个黑盒,DUT内部是完全不可见的 白盒验证 - DUT内部RTL完全可见 灰盒验证 - DUT内部 ...
- [转帖]在KingbaseES数据库中批量创建数据库/表
1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,s ...
- [转帖]CentOS8完美升级gcc版本方法
https://blog.whsir.com/post-6114.html 在CentOS8系统中,默认gcc版本已经是8.x.x版本,但是在一些场景中,还是需要高版本的gcc,网上一些作死的文章还在 ...
- Redis性能问题诊断以及scan命令耗时分析
Redis性能问题诊断以及scan命令耗时分析 摘要 最近公司有项目反馈卡顿. 卡顿一小时后自己被拉入群聊. 同事已经基本上定位到问题原因. 我这边想使用朴素的性能观点进行一下性能问题的拆解 为了提高 ...
- CS231N Assignment1 SVM 笔记
svm.ipynb 为SVM实现一个完全矢量化的损失函数 为其解析梯度实现完全矢量化表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化 使用 SGD 优化损失函数 可视化最终学习权重 第一 ...