QOJ.ac

QOJ

Límite de tiempo: 1.0 s Límite de memoria: 1024 MB Puntuación total: 100 Hackeable ✓

#9733. 重链剖分

Estadísticas

重链剖分(Heavy-light Decomposition,简称 HLD)是一种应用于树的有效技术,用于高效查询顶点链。在开始之前,我们先回顾一下 HLD 的定义。

给定一棵有 $n$ 个顶点的有根树,顶点编号从 $1$ 到 $n$。你需要将每个非根顶点分类为重顶点或轻顶点。每个非叶子节点恰好有一个子节点被分类为重节点,其余子节点为轻节点。

对于任意非根顶点 $v$,设 $u$ 为其父节点。仅当 $v$ 的子树大小在 $u$ 的所有子节点中最大时,顶点 $v$ 才能被分类为重节点。更正式地说,记以顶点 $v$ 为根的子树大小为 $s_v$,并令 $\text{ch}(u)$ 表示 $u$ 的子节点集合。那么,仅当对于所有 $w \in \text{ch}(u)$ 都有 $s_v \geq s_w$ 时,$v$ 才能是重节点。注意,$u$ 的子节点中可能存在多个满足此约束的节点;在这种情况下,你应该选择其中一个作为重节点,其余的作为轻节点。

此后,树的所有顶点可以分解为若干个互不重叠的重链,其中每个顶点恰好属于一条重链。重链是一个满足以下所有约束的顶点序列 $x_1, x_2, \dots, x_k$:

  • $x_1$ 是根节点或轻节点。
  • 对于所有 $2 \leq i \leq k$,$x_i$ 是 $x_{i-1}$ 的子节点且是重节点。
  • $x_k$ 是叶子节点。

一个 HLD 示例。重链用实线红边标记。

例如,上图展示了一棵具有 12 个顶点的树的有效 HLD,其中重链为 $[1, 2, 3, 4, 5]$、$[9, 10, 11]$、$[7, 8]$、$[6]$ 和 $[12]$。

Pig100Ton 是 Pigeland 的一名资深竞赛选手。他想知道是否可以从 HLD 后的重链中恢复出原始树。具体来说,他会给你原始树的顶点数 $n$ 和 $k$ 条重链。第 $i$ 条链由两个整数 $l_i$ 和 $r_i$ 描述,表示重链为 $l_i, l_i + 1, \dots, r_i$。

你的任务是构造一棵满足以下约束的树,或者告诉 Pig100Ton 这是不可能的:

  • 它是一棵包含 $n$ 个顶点(编号从 $1$ 到 $n$)的有根树。
  • Pig100Ton 提供的 $k$ 条链应构成该树的有效 HLD。有效的 HLD 指的是一种将每个非根顶点分类为轻节点或重节点,并将树分解为若干互不重叠的重链的有效方式。

输入格式

输入包含多组测试数据。第一行包含一个整数 $T$ ($1 \leq T \leq 10^5$),表示测试数据组数。对于每组测试数据:

第一行包含两个整数 $n$ 和 $k$ ($1 \leq n \leq 10^5, 1 \leq k \leq n$),表示树的顶点数和 HLD 后的重链数。

接下来的 $k$ 行中,第 $i$ 行包含两个整数 $l_i$ 和 $r_i$ ($1 \leq l_i \leq r_i \leq n$),表示第 $i$ 条重链为 $l_i, l_i + 1, \dots, r_i$。

保证每个顶点恰好属于给定的某一条重链。同时保证所有测试数据的 $n$ 之和不超过 $2 \times 10^5$。

输出格式

对于每组测试数据:

如果可以构造出这样一棵树,输出一行包含 $n$ 个整数 $p_1, p_2, \dots, p_n$,以空格分隔,其中 $p_i$ 是顶点 $i$ 的父节点。$p_i = 0$ 表示顶点 $i$ 是根节点。如果存在多个有效解,你可以输出其中任意一个。

如果无法构造出这样一棵树,则输出一行 IMPOSSIBLE

样例

输入 1

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

输出 1

0 1 2 3 4 3 2 7 1 9 10 10
2 0 2 2
IMPOSSIBLE

说明

对于第一组测试数据,样例输出即为题目描述中的树。

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.