F. 异或、树与查询
时间限制:每个测试点 3 秒
内存限制:256 MB
题目描述
你有一棵包含 n 个顶点的树,顶点编号为 1 到 n。
你需要为每条边分配一个权值。设第 i 条边的权值为 ai(1≤i≤n−1)。每条边的权值应当是一个介于 0 和 230−1 之间的整数。
你将得到 q 个条件。每个条件包含三个整数 u、v 和 x。这意味着从 u 到 v 的最短路径上所有边的异或和应为 x。
请判断是否存在满足所有条件的 a1,a2,…,an−1。若存在,请输出一组解,使得 a1⊕a2⊕…⊕an−1 最小。此处 ⊕ 表示按位异或运算。
若有多组解使得 a1⊕a2⊕…⊕an−1 最小,输出任意一组即可。
输入格式
第一行包含两个整数 n 和 q(2≤n≤2.5×105,0≤q≤2.5×105)。
接下来的 n−1 行中,第 i 行包含两个整数 xi 和 yi(1≤xi,yi≤n,xi=yi),表示第 i 条边连接顶点 xi 和 yi。
输入保证给出的边构成一棵树。
接下来的 q 行包含条件信息。
每行包含三个整数 u、v 和 x(1≤u,v≤n,u=v,0≤x≤230−1),表示从 u 到 v 的最短路径上所有边的异或和应为 x。
输出格式
如果不存在满足所有条件的 a1,a2,…,an−1,则输出 "No"。
否则,第一行输出 "Yes"。
第二行输出 n−1 个整数,其中第 i 个整数为第 i 条边的权值。如果存在多组满足条件的解,请输出使得 a1⊕a2⊕…⊕an−1 最小的解。
若有多组解使得 a1⊕a2⊕…⊕an−1 最小,输出任意一组。
输出 "Yes" 或 "No" 时,大小写任意。例如,"yEs"、"yes"、"Yes"、"YES" 均会被识别为肯定回答。
样例
样例输入 1
4 4
1 2
2 3
3 4
1 4 3
2 4 2
1 3 1
2 3 1
样例输出 1
No
样例输入 2
6 2
1 2
2 3
3 4
2 5
5 6
1 4 2
2 6 7
样例输出 2
Yes
4 2 4 1 6
样例输入 3
6 2
1 2
2 3
3 4
2 5
5 6
1 4 3
1 6 5
样例输出 3
Yes
6 1 4 3 0
样例说明
第一个样例:不存在满足所有条件的边权集合。
第二个样例:两个条件分别是 a1⊕a2⊕a3=2 和 a4⊕a5=7。可能有多组解,例如 (a1,a2,a3,a4,a5)=(1,2,1,4,3)。
第三个样例:两个条件分别是 a1⊕a2⊕a3=3 和 a1⊕a4⊕a5=5。存在多组满足条件的解。
(a1,a2,a3,a4,a5)=(1,1,3,4,0) 满足条件,但所有边权的异或和为 7,不是最小的 a1⊕a2⊕…⊕an−1,因此不能作为答案。