CF1632E2.Distance Tree (hard version)

省选/NOI-

通过率:0%

时间限制:2.00s

内存限制:512MB

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

This version of the problem differs from the previous one only in the constraint on nn.

A tree is a connected undirected graph without cycles. A weighted tree has a weight assigned to each edge. The distance between two vertices is the minimum sum of weights on the path connecting them.

You are given a weighted tree with nn vertices, each edge has a weight of 11. Denote d(v)d(v) as the distance between vertex 11 and vertex vv.

Let f(x)f(x) be the minimum possible value of max⁡1≤v≤n d(v)\max\limits_{1 \leq v \leq n} \ {d(v)} if you can temporarily add an edge with weight xx between any two vertices aa and bb (1≤a,b≤n)(1 \le a, b \le n). Note that after this operation, the graph is no longer a tree.

For each integer xx from 11 to nn, find f(x)f(x).

本题与前一版本的唯一区别在于对 nn 的约束条件。

树是一种无环的连通无向图。带权树为每条边赋予一个权重。两点之间的距离定义为连接它们的路径上边权之和的最小值。

给定一棵含 nn 个顶点的带权树,其中每条边的权重均为 11。记 d(v)d(v) 为顶点 11 与顶点 vv 之间的距离。

定义 f(x)f(x) 为:在任意两个顶点 aa 和 bb(1≤a,b≤n1 \le a, b \le n)之间临时添加一条权重为 xx 的边后,max⁡1≤v≤n d(v)\max\limits_{1 \leq v \leq n} \ {d(v)} 所能取到的最小可能值。注意,执行此操作后,图将不再是一棵树。

对每个从 11 到 nn 的整数 xx,求出 f(x)f(x)。

输入格式

The first line contains a single integer tt (1≤t≤1041 \le t \le 10^4) — the number of test cases.

The first line of each test case contains a single integer nn (2≤n≤3⋅1052 \le n \le 3 \cdot 10^5).

Each of the next n−1n−1 lines contains two integers uu and vv (1≤u,v≤n1 \le u,v \le n) indicating that there is an edge between vertices uu and vv. It is guaranteed that the given edges form a tree.

It is guaranteed that the sum of nn over all test cases doesn't exceed 3⋅1053 \cdot 10^5.

第一行包含一个整数 tt(1≤t≤1041 \le t \le 10^4)—— 表示测试用例的数量。

每个测试用例的第一行包含一个整数 nn(2≤n≤3⋅1052 \le n \le 3 \cdot 10^5)。

接下来的 n−1n-1 行中,每行包含两个整数 uu 和 vv(1≤u,v≤n1 \le u,v \le n),表示顶点 uu 和 vv 之间存在一条边。保证所给的边构成一棵树。

保证所有测试用例的 nn 之和不超过 3⋅1053 \cdot 10^5。

输出格式

For each test case, print nn integers in a single line, xx-th of which is equal to f(x)f(x) for all xx from 11 to nn.

对于每个测试用例,在一行中输出 nn 个整数,其中第 xx 个整数等于 f(x)f(x)(xx 从 11 到 nn)。

输入输出样例

  • 输入#1

    3
    4
    1 2
    2 3
    1 4
    2
    1 2
    7
    1 2
    1 3
    3 4
    3 5
    3 6
    5 7

    输出#1

    1 2 2 2 
    1 1 
    2 2 3 3 3 3 3

说明/提示

In the first testcase:

  • For x=1x = 1, we can an edge between vertices 11 and 33, then d(1)=0d(1) = 0 and d(2)=d(3)=d(4)=1d(2) = d(3) = d(4) = 1, so f(1)=1f(1) = 1.
  • For x≥2x \ge 2, no matter which edge we add, d(1)=0d(1) = 0, d(2)=d(4)=1d(2) = d(4) = 1 and d(3)=2d(3) = 2, so f(x)=2f(x) = 2.

在第一个测试用例中:

  • 当 x=1x = 1 时,我们可以在顶点 11 和 33 之间添加一条边,此时 d(1)=0d(1) = 0,而 d(2)=d(3)=d(4)=1d(2) = d(3) = d(4) = 1,因此 f(1)=1f(1) = 1。
  • 当 x≥2x \ge 2 时,无论添加哪条边,均有 d(1)=0d(1) = 0,d(2)=d(4)=1d(2) = d(4) = 1,且 d(3)=2d(3) = 2,因此 f(x)=2f(x) = 2。

输入解题思路,AI测评打分。不知道怎么写?

首页