原题链接 Codeforces Global Round 16 E. Buds Re-hanging

首先想到,如果我们把一个\(buds\)挂到一个叶子上,那么会使得叶子总数减\(1\)。

还有就是如果我们可以把这个树搞成一条链,那么总叶子数一定是最少的,就是让树“越瘦越好”。

如果原来一个\(buds\)挂在一个没有其他孩子的结点上,我们拿走这个\(buds\)之后会使得总叶子数加\(1\),我们称这个结点为 \(\alpha\),如果一个buds挂在一个有其他孩子的节点上,那么拿走这个\(buds\)总叶子数不会改变,我们称这个结点为\(\beta\)。

我们考虑把所有的\(buds\)全挂在\(root\)上,那么这样做会使结果变坏吗?当然不会

  1. 如果一个\(buds\)挂在一个\(\beta\)结点上,那么拿走后总叶子数不变。
  2. 如果一个\(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的更多相关文章

  1. CodeForces 构造题专项解题报告

    CodeForces 构造题专项解题报告 \(\newcommand \m \mathbf\)\(\newcommand \oper \operatorname\) \(\text{By DaiRui ...

  2. 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 ...

  3. Codeforces Round #584 D. Cow and Snacks

    链接: https://codeforces.com/contest/1209/problem/D 题意: The legendary Farmer John is throwing a huge p ...

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  10. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

随机推荐

  1. C#/.net/DotNet/Emgu.CV裁剪照片头像

    头像裁剪有利于人脸识别批量照片预处理,安防领域可以快速通过视频定位人脸,进行抓拍,做人脸识别相关功能的可能会应用到人脸裁剪,以下是我在实践中应用的代码,如有需要复制粘贴即可使用. using Emgu ...

  2. linux下创建虚拟环境

    安装虚拟环境: 1 sudo apt-get install virtualenvwrapper 配置环境变量: 1.创建目录用于存放虚拟环境. 1 mkdir $HOME/.virtualenvs ...

  3. G-channel 实现低光图像增强

    G-channel 之前研究低光图像增强时,看到一篇博客,里面介绍了一种方法,没有说明出处,也没有说明方法的名字,这里暂时叫做 G-channel 算法. 博客地址:低照度图像增强(附步骤及源码)_低 ...

  4. 【技术实战】Vue功能样式实战【六】

    需求实战一 样式展示 代码展示 <template> <ARow> <ACol style="background-color:#F1F4F5 "&g ...

  5. 重复的dna序列

    DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.. 例如,"ACGAATTCCG" 是一个 DNA序列 . 在研究 DNA 时,识别 DNA 中的重 ...

  6. ffmpeg 在xp和server2003/2008/2012上修复无法定位GetNumaNodeProcessorMaskEx的问题

    问题 在给开发一个手机视频网站时需要用到ffmpeg截取视频缩略图, 把项目提交到服务器(server2003/ server2008)上时, 发现在调用命令时会出现错误"无法定位GetNu ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

    一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...

  8. 3-MySQL基本数据类型介绍

    数据类型的介绍: 数据类型(data_type)是指系统中所允许的数据的类型.数据库中的每个列都应有适当的数据类型,用于限制或允许该列中存储的数据.例如,列中存储的为数字,则相应的数据类型应该为数值类 ...

  9. 「にちじょう記録」MTIDnWtMOA

    Mistakes That I Don't Want to Make Once Again. // Caution // 差分 / 前缀和后注意询问区间端点有变化-- 不要考虑了右边界就不考虑左边界 ...

  10. Record - Dec. 2st, 2020 - Exam. REC

    Prob. 1 Desc. & Link. 有一个基础想法,即一次操作三可以用一次操作一加上一次操作二来实现,然后他又没让我们最小化操作次数,所以我们令 \(M=\min\{A+R,M\}\) ...