#P6086. 【模板】Prufer 序列(Prufer Sequence)

0
    ID: 8507 传统题 2000ms 512MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>P6086Prufer 序列与 Caley 公式Prufer序列树形结构NOICSP-S

【模板】Prufer 序列(Prufer Sequence)

【模板】Prufer 序列(Prufer Sequence)

题目描述

Prüfer 序列又写作 Prufer 序列。

请实现 Prüfer 序列和无根树的相互转化。

为方便你实现代码,尽管是无根树,我们在读入时仍将 nn 设为其根。

对于一棵无根树,设 f1…n−1f_{1\dots n-1} 为其父亲序列(fif_i 表示 ii 在 nn 为根时的父亲),设 p1…n−2p_{1 \dots n-2} 为其 Prüfer 序列。

另外,对于一个长度为 mm 的序列 a1…ma_{1 \dots m},我们设其权值为 xor⁡i=1mi×ai\operatorname{xor}_{i = 1}^m i \times a_i。

输入格式

第一行两个整数 n,mn,m,表示树的点数和转化类型。

若 m=1m = 1,第二行一行 n−1n-1 个整数,表示父亲序列。
若 m=2m = 2,第二行一行 n−2n-2 个整数,表示 Prüfer 序列。

输出格式

若 m=1m = 1,一行一个整数,表示给出的父亲序列对应的 Prüfer 序列的权值。
若 m=2m = 2,一行一个整数,表示给出的 Prüfer 序列对应的父亲序列的权值。

样例输入 #1

6 1
3 6 4 6 1

样例输出 #1

29

样例输入 #2

6 2
4 6 5 2

样例输出 #2

4

数据范围

【样例 1 解释】

p={6 1 3 4}p = \{6\ 1\ 3\ 4\}。

【样例 2 解释】

f={4 6 6 5 2}f = \{4\ 6\ 6\ 5\ 2\}。


【数据范围】

测试点编号 2≤n≤2 \le n \le m=m =
11 10310^3 11
22 10510^5
33
44 5×1065 \times 10^6
55
66 10310^3 22
77 10510^5
88
99 5×1065 \times 10^6
1010

知识点与难度

本题涉及的知识点从属于 NOI,难度(CF Rating):2100。


测试点分布

Subtask 分值 测试点编号 说明
0 10 1~2 样例
1 20 3~8 小规模 n≤1000 (m=1与m=2各半) / 特殊: n=2(Prüfer序列为空,权值为0) / 特殊: 菊花树与单链
2 40 9~21 中等与较大规模 n≤100000 (m=1与m=2全覆盖,含指针回跳Hack)
3 30 22~25 满规模 n=2×10^6~5×10^6 (m=1与m=2) 线性O(n)算法与64位异或权值压力测试

出处:原题链接