1292: 博博又弈弈
Description
这一天Alice和Bob又在玩博弈游戏,游戏是这样的,有一颗n个节点的树,树上的每一个节点都有一个点权值,alice先进行游戏,然后bob在进行,以此循环往复。第一次行动时alice可以随意挑选一个节点将它占领,然后下一个行动的人只能选择一个还没有被占领的节点,满足这个节点和上一个被占领的节点相邻,记上一个被占领的节点为last,当前占领的节点为node,同时还需要满足$val [ node ] $^$ val [ last ] <= min(val[node], val[last])$ ,$val[node]$代表node节点的点权值。当一方游戏时,不存在可以操作的节点那么这个人就输了。
现在我们需要帮助alice确定她第一步放在哪个节点一定可以获得胜利(假设alice和bob所采取的都是对于自己最优的决策)。
注:我校NWUOJ的C++编译器没有std::__lg()函数,如需使用,请手写该函数。
Input
第一行输入一个正整数t,代表t次询问。
每个询问的第一行输入一个整数 $n(1\leq n \leq 2e5)$,表示树的节点个数。
每个询问的第二行输入 $n$ 个整数 $val[i] (0 <= val[i] <= 1e9)$。
每个询问的第三行到第 $n + 1$ 行输入 $n - 1$ 个整数对 , 每个整数对$x, y(1 \le x, y \le n)$,代表节点x和节点y之间存在一条无向边,保证给出的图一定是一颗树,没有重边和自环。
输入保证 $\sum n\le2\times10^5$。
Output
对于每个询问第一行输出一个整数num$(0 \le num \le n)$
接下来一行输出num个整数$ node[i] $ $(0 \le i < num)$,从小到大,表示alice初始将节点放在$node[i] $$(0 \le i < num)$ 这些节点可以获得胜利
Sample Input Copy
3
1
1
2
1 2
1 2
3
1 2 3
1 2
1 3
Sample Output Copy
1
1
2
1 2
3
1 2 3