#CF2062E2. 游戏(困难版)

游戏(困难版)

题目描述

每个测试点时间限制:66
每个测试点内存限制:512512 兆字节

这是该问题的困难版本。两个版本的区别在于:本版本中你需要找出 Cirno 可能选择的所有节点。只有当你解决了所有版本的问题时,你才能进行 hack。

Cirno 和 Daiyousei 在一棵有 nn 个节点的树上玩游戏,树以节点 11 为根。第 ii 个节点的权值为 wiw_i。两人轮流进行操作;Cirno 先手。

在每一轮中,假设上一轮对手选择了节点 jj,则当前玩家可以选择任意一个尚未被删除的节点 ii,满足 wi>wjw_i > w_j,并删除节点 ii 的子树†。特别地,Cirno 在第一轮可以选择任意一个节点并删除它的子树。

无法进行操作的玩家获胜,且双方都希望获胜。找出 Cirno 在第一回合可能选择的所有节点,使得在双方都最优操作的情况下 Cirno 获胜。

† 如果从 11uu 的任意路径都必须经过节点 ii,则认为节点 uu 在节点 ii 的子树中。

输入格式

第一行输入一个整数 tt1t1051 \le t \le 10^5)—— 测试用例的数量。
每个测试用例的第一行包含一个整数 nn1n41051 \le n \le 4 \cdot 10^5)—— 树中节点的数量。
第二行包含 nn 个整数 w1,w2,,wnw_1, w_2, \dots, w_n1win1 \le w_i \le n)—— 每个节点的权值。
接下来的 n1n-1 行包含树的边。第 ii 行包含两个整数 ui,viu_i, v_i1ui,vin1 \le u_i, v_i \le nuiviu_i \neq v_i)—— 连接 uiu_iviv_i 的边。输入保证这些边构成一棵树。
保证所有测试用例的 nn 之和不超过 41054 \cdot 10^5

输出格式

对于每个测试用例,输出一行。
如果 Cirno 获胜,输出若干个整数。第一个整数 kk 表示她第一回合可能选择的节点数量,之后按递增顺序输出这 kk 个节点。
否则,输出 00(不带引号)。

5
4
2 2 4 3
1 2
1 3
2 4
5
1 2 3 4 5
1 2
2 3
3 4
4 5
3
1 2 3
1 2
1 3
5
3 1 3 4 5
1 2
2 3
3 4
4 5
10
1 2 3 2 4 3 3 4 4 3
1 4
4 6
7 4
6 9
6 5
7 8
1 2
2 3
2 10
2 2 4
0
1 2
1 2
5 3 4 6 7 10

说明

在第一个测试用例中:

  • 若 Cirno 第一回合选择节点 1133,则 Daiyousei 无法操作,Daiyousei 获胜。
  • 若 Cirno 选择节点 2244,则 Daiyousei 只能选择节点 33,之后 Cirno 无法操作,故 Cirno 获胜。
    因此 Cirno 可能选择的节点为 2244

在第二个测试用例中,无论 Cirno 选择哪个节点,Daiyousei 都无法操作,故 Daiyousei 获胜。

在第三个和第四个测试用例中,Cirno 在第一回合可能选择的唯一节点是 22

在第五个测试用例中,Cirno 在第一回合可能选择的节点为 3,4,6,73, 4, 6, 71010