生成树问题
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

题目描述

给定 n 个点,点编号为 1 ~ n。

你需要判断,是否存在一棵以这 n 个点为顶点的树,以及一个根节点 r,满足以下条件:

- 第 i 个点的点权为 a[i],其中 a[i] in {0,1};
- 对于每个点 i,记从根节点 r 到点 i 的简单路径上所有点权的异或和为 b[i],且给定的 b[i] 与该路径异或和完全一致。

这里,异或运算记作 XOR。对于两个 0/1 数 x, y:

- 当 x = y 时,x XOR y = 0;
- 当 x != y 时,x XOR y = 1。

一条路径上若经过的点权依次为 c[1], c[2], ..., c[k],则这条路径的异或和定义为

c[1] XOR c[2] XOR ... XOR c[k]

注意,路径包含起点和终点,因此根节点自身对应的路径异或和也需要计入。

你只需要判断是否存在这样的树和根节点 r,无需构造方案。

输入描述:

第一行一个整数 n,表示点的个数。

第二行 n 个整数 a1,a2,,an,其中每个数均为 0 或 1,表示每个点的点权。

第三行 n 个整数 b1,b2,,bn,其中每个数均为 0 或 1,表示从某个未知根节点到各点路径上的异或和。

  • 对于 100% 的数据,1n100000
  • ai,bi{0,1}

输出描述:

如果存在满足条件的树与根节点,输出 Yes;否则输出 No。


示例1

输入

复制
4
1 0 1 0
1 1 0 1

输出

复制
Yes
示例2

输入

复制
2
0 1
0 0

输出

复制
No
示例3

输入

复制
1
0
0

输出

复制
Yes