QOJ.ac

QOJ

حد الوقت: 3 s حد الذاكرة: 2048 MB مجموع النقاط: 100

#5157. 高质量树

الإحصائيات

二叉搜索树是计算机科学中最有用的数据结构之一。存在许多保持其平衡的方法,例如使用树旋转(如 AVL 树)或随机化(如 Treap)。这些方法的一个共同点是它们都有些缓慢且复杂。

但这一切即将改变!计算机科学家 Rob 发明了一种保持有根二叉树平衡的新方法,它比目前最先进的方法要好得多。其核心思想是重复执行一种 Rob 称为“抢劫”(robbery)的操作。一次抢劫就是从树中取走一个叶子节点并将其移除。通过在合适的时机进行抢劫,Rob 能够以 $O(1)$ 的摊销时间保持树的平衡。

有些人批评了 Rob 的革命性发现,认为从树中移除元素会使算法变得不正确。Rob 不同意这是一个大问题;如果你打算存储 $2 \cdot 10^5$ 个数字,你可能并不需要全部存储它们。但 Rob 接受了批评,并决定寻找一种最小化抢劫次数的方法。

图 H.1:样例输入 2 的示意图。在移除标记为红色的三个顶点(4、5 和 10)后,树变得强平衡;这是使树达到强平衡所需移除的最小顶点数。

给定一棵有 $n$ 个顶点的有根二叉树。顶点编号从 1 到 $n$,顶点 1 为根。你的任务是找到使树达到“强平衡”所需的最小抢劫次数,这意味着它的所有子树都是平衡的。如果一棵有根二叉树的左子树和右子树的深度之差不超过 1,则称其为平衡的。回想一下,抢劫仅仅是取走一个叶子并将其移除,这样做可能会使其父节点变成一个叶子。参见图 H.1 了解示例。

输入格式

输入包含:

  • 一行包含一个整数 $n$ ($1 \le n \le 2 \cdot 10^5$),表示树中顶点的数量。
  • $n - 1$ 行,每行包含两个整数 $u$ 和 $v$ ($1 \le u, v \le n, u \neq v$),表示顶点 $u$ 和 $v$ 之间的一条边。

保证给定的边构成一棵以顶点 1 为根的有效二叉树。然而,边的出现顺序可以是任意的,且边是无向的:$u$ 可以是 $v$ 的父节点,反之亦然。

输出格式

输出使树达到强平衡所需移除的叶子的最小数量。

样例

样例输入 1

6
1 2
1 3
3 4
3 5
5 6

样例输出 1

1

样例输入 2

12
1 2
2 3
3 4
3 5
1 6
6 7
7 8
7 9
9 10
6 11
11 12

样例输出 2

3

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.