Codeforces 1566E Buds Re-hanging
原题链接 Codeforces Global Round 16 E. Buds Re-hanging
首先想到,如果我们把一个\(buds\)挂到一个叶子上,那么会使得叶子总数减\(1\)。
还有就是如果我们可以把这个树搞成一条链,那么总叶子数一定是最少的,就是让树“越瘦越好”。
如果原来一个\(buds\)挂在一个没有其他孩子的结点上,我们拿走这个\(buds\)之后会使得总叶子数加\(1\),我们称这个结点为 \(\alpha\),如果一个buds挂在一个有其他孩子的节点上,那么拿走这个\(buds\)总叶子数不会改变,我们称这个结点为\(\beta\)。
我们考虑把所有的\(buds\)全挂在\(root\)上,那么这样做会使结果变坏吗?当然不会
- 如果一个\(buds\)挂在一个\(\beta\)结点上,那么拿走后总叶子数不变。
- 如果一个\(buds\)挂在一个\(\alpha\)结点上,那么拿走后总叶子数会加\(1\),但是我们完全可以再搞一个\(buds\)挂在\(\alpha\)结点上,这样就叶子总数又减少了。
全挂在\(root\)上之后,我们考虑再将其变成一条链子,怎么变呢?
首先设总结点数为\(n\),\(buds\)数为\(k\),那么由于所有\(buds\)全挂在了\(root\)上,那么现在的叶子数就是\(n - k - 1\)
情况一:如果\(root\)上有一个叶子结点, 那么我们不妨把\(k\)个\(buds\)依次全挂到这个叶子节点上,那么我们挂一次少一个叶子,那么答案就是\(n - k - 1 - k\)
情况二:如果\(root\)上没有叶子结点,那么我们就把\(k - 1\)个\(buds\)都依次挂到一个\(bud\)上就行,那么答案就是\(n - k - 1 - (k - 1)\)
代码:
// Problem: E. Buds Re-hanging
// Contest: Codeforces - Codeforces Global Round 16
// URL: https://codeforces.com/contest/1566/problem/E
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 2E5 + 10;
vector<int> g[N];
int type[N]; //0 -- root, 1 -- leaf, 2 -- bud
void dfs(int u, int fa) {
bool leaf = false;
for (auto v : g[u]) {
if (v == fa) continue;
dfs(v, u);
if (type[v] == 1) leaf = true;
}
if (u != fa) {
if (!leaf) type[u] = 1;
else type[u] = 2;
}
}
int main() {
int _; scanf("%d", &_);
while (_--) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) g[i].clear();
memset(type, -1, sizeof type);
for (int i = 1; i <= n - 1; i++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
type[1] = 0;
dfs(1, 1);
bool rHas_leaf = false;
for (auto it: g[1]) {
if (type[it] == 1) {
rHas_leaf = true;
break;
}
}
//将所有buds直接接到根上,这样在把buds拿走接到一个leaf上只会减少一个leaf数,而不会增加leaf
//设buds有k个,那么现在叶子节点数n - k - 1
/*
如果根有叶子结点,我们选择将k个buds顺次接到这个叶子结点上,接一次减少1,所以答案n - k - 1 - k
如果根没有叶子结点,那么将其他buds接到其中一个bud上去,那么答案n - k - 1 - (k - 1)
*/
int k = 0;
for (int i = 1; i <= n; i++) {
if (type[i] == 2) k += 1;
}
if (rHas_leaf) printf("%d\n", n - 2 * k - 1);
else printf("%d\n", n - 2 * k);
}
return 0;
}
Codeforces 1566E Buds Re-hanging的更多相关文章
- CodeForces 构造题专项解题报告
CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...
- Codeforces Round #283 (Div. 2) A ,B ,C 暴力,暴力,暴力
A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Codeforces Round #584 D. Cow and Snacks
链接: https://codeforces.com/contest/1209/problem/D 题意: The legendary Farmer John is throwing a huge p ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
随机推荐
- 掌握Spring条件装配的秘密武器
本文分享自华为云社区<Spring高手之路9--掌握Spring条件装配的秘密武器>,作者:砖业洋__. 在Spring框架中,条件装配是一个强大的功能,可以帮助我们更好地管理和控制Bea ...
- 【全新重构发布】iNeuOS工业互联网操作系统 V5 版本
iNeuOS工业互联网操作系统历经迭代27个版本,老版本截止更新V4.1版本:历时一年多时间,现在正式发布全新V5版本,V5版本与V4.1老版本不完全兼容. 发布V5版本后,iNeuOS工业互联网操作 ...
- 我也来扒一扒python的内存回收机制!
python的内存回收是面试中经常会问到一个问题,今天我来给大家深度剖析下python的内存回收和缓存机制 1.引用计数器 我们知道,python是通过引用计数器来做内存回收的,下面我们来重点讲下引用 ...
- 零代码,使用 Dify 和 Laf 两分钟接入企业微信 AI 机器人
Dify 允许创建 AI 应用,并提供二次开发的能力.这里我将演示创建一个法律问答助手的 AI 应用,称作"知法".在本篇教程中,我将指导你为"知法"接入企业微 ...
- android webview调用js(vue)问题记录
这几天和别人对接移动端,安卓平台,我们这边输出vue界面,安卓方反馈轮询的时候调用不到,具体原因也定位不到,只能确定前端这边没几句代码,应该没有问题,因此决定自己下载个android studio写个 ...
- Python 设置环境变量方法
Python中的os模块 Python中的os模块提供了很多与操作系统相关的功能.其中就包括设置环境变量的方法,即setenv()方法. 使用os.setenv()方法设置环境变量 import os ...
- 【RocketMQ】消息的拉取总结
在上一讲中,介绍了消息的存储,生产者向Broker发送消息之后,数据会写入到CommitLog中,这一讲,就来看一下消费者是如何从Broker拉取消息的. RocketMQ消息的消费以组为单位,有两种 ...
- PYQT5学习(12)Qtabwidget 选项卡及其窗口,Qstackedwidget和Qtabwidget的效果类似,以及系统托盘QsystemtrayIcon
参考博文:https://blog.csdn.net/jia666666/article/details/81669092QTabWidget控件提供一个选项卡和一个页面区域,默认显示第一个选项卡的页 ...
- MySQL 表分区简介
MySQL表分区是一种数据库管理技术,用于将大型表拆分成更小.更可管理的分区(子表).每个分区可以独立进行维护.备份和查询,从而提高数据库性能和管理效率.以下是详细介绍MySQL表分区的步骤和注意事项 ...
- vue2和vue3使用echarts时无数据,怎么显示暂无数据图片或文字
一开始也经历了用v-if和v-show,v-show的话echarts还会留出暂无数据图片的位置,导致echarts变形,v-if在加载和不加载切换时,dom会获取不到:后来也是在网上找的方法,时间有 ...