U224599 Crosswater
题目描述
一个集合的 mex+ 定义为不出现在其中的最小 **正整数**,例如 $\operatorname{mex}^{+}(\{1,2,3\})=4$,$\operatorname{mex}(\{0,1,4,9\})=2$,$\operatorname{mex}^+(\{0,1,2,3,4\})=5$ .
有一棵树,每个点 $u$ 有点权 $a_u$,$q$ 次询问,每次询问点 $u$ 到点 $v$ 简单路径上所有点点权的 mex+ .
保证 $\{a\}$ 是一个排列 .
输入格式
使用随机数生成器:
```cpp
// C++
#include
#include
#include
using namespace std;
const int N = 12345;
int n, q, a[N], fa[N];
class __gen
{
public:
typedef uint32_t u32;
typedef uint64_t u64;
explicit __gen(const u32& seed)
{
z0 = z1 = seed;
z2 = (~seed) ^ 233114514u;
z3 = seed ^ 233191981u;
z4 = (~(z1 + z2 - z3) | 1) + 1;
x = seed - 1;
}
u32 operator()()
{
z1 = splitmix64(z1 + z0) ^ x;
z2 = splitmix64(z2 + z1) ^ x;
z3 = splitmix64(z3 + z2) ^ x;
z4 = splitmix64(z4 + z3) ^ x;
return z1 ^ z2 ^ z3 ^ z4;
}
private:
unsigned z0, z1, z2, z3, z4, x;
inline u64 splitmix64(const u64& v) const
{
u64 z = (v + 0x9e3779b97f4a7c15);
z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
return z ^ (z >> 31);
}
};
int main()
{
unsigned seed;
scanf("%d%d%u", &n, &q, &seed);
__gen rnd(seed); a[1] = 1;
for (int i=2; i
输出格式
输出所有答案的异或和即可 .
说明/提示
样例 1 解释:
异或前的询问答案分别是 2, 1, 4,异或和为 7 .
***
数据范围:
对于 $20\%$ 的数据,$n\le 10^3$,$q\le 10^2$ .
对于 $50\%$ 的数据,$n\le 100$,$q\le 10^5$ .
对于全部数据,有 $1\le n\le 10^4$,$1\le q\le10^5$,$seed$ 在 32 位无符号整型表示的范围内 .