P11283 「GFOI Round 2」Turtle and Nediam
题目描述
对一个元素互不相同的长度 $\ge 3$ 的正整数序列 $a$,定义 $a$ 的“肿胃数(nediam)”$f(a)$ 为:
- 当 $|a| = 3$ 时,$f(a)$ 为 $a$ 的中位数;
- 当 $|a| > 3$ 时,取 $a$ 的任意一个长度为 $3$ 的子段 $[a_i, a_{i + 1}, a_{i + 2}]$,记这个子段的中位数为 $x$,$a$ 删掉 $x$ 后的序列为 $b$,$f(a)$ 为所有 $b$ 中 $f(b)$ 的最大值。
乌龟给你一个 $1 \sim n$ 的排列 $p_1, p_2, \ldots, p_n$ 和 $m$ 次询问,每次询问给定 $l, r$,你需要求出 $[p_l, p_{l + 1}, \ldots, p_r]$ 的“肿胃数(nediam)”,即 $f([p_l, p_{l + 1}, \ldots, p_r])$。
输入格式
为了加快读入速度,我们采用以下读入方法。
第一行包含六个正整数 $n, m, seed, A, B, C$。
第二行包含一个排列 $p_1, p_2, \ldots, p_n$。
接下来的 $m$ 组询问,每组询问你要按照如下的方式生成 $(l, r)$:
```cpp
unsigned seed, A, B, C;
inline unsigned rnd() {
seed = A * seed * seed + B * seed + C;
seed = seed ^ (seed > 19);
return seed;
}
inline std::pair gen() {
int l, r;
do {
l = rnd() % n + 1;
r = rnd() % n + 1;
} while (abs(l - r) < 2);
if (l > r) {
std::swap(l, r);
}
return std::make_pair(l, r);
}
```
每组询问调用一次 `gen()` 生成这组询问的 $(l, r)$。
输出格式
为了加快输出速度,我们采用以下输出方法。
设第 $i$ 组询问的答案为 $ans_i$,你需要输出 $(1 \times ans_1) \oplus (2 \times ans_2) \oplus \cdots \oplus (m \times ans_m)$,其中 $\oplus$ 为按位异或。
说明/提示
#### 【样例解释 #1】
生成的四组询问分别为 $(1, 4), (1, 3), (1, 3), (2, 4)$,答案分别为 $2, 3, 3, 3$,所以你需要输出 $(1 \times 2) \oplus (2 \times 3) \oplus (3 \times 3) \oplus (4 \times 3) = 2 \oplus 6 \oplus 9 \oplus 12 = 1$。
对于第一组询问,选择子段 $[1, 3, 4]$ 或 $[3, 4, 2]$ 都会使得 $3$ 被删除。删除 $3$ 后的序列为 $[1, 4, 2]$,中位数为 $2$。
#### 【数据范围】
**本题使用捆绑测试。**
| 子任务编号 | $n \le$ | $m \le$ | 特殊性质 | 分值 |
| :-: | :-: | :-: | :-: | :-: |
| $1$ | $18$ | $100$ | 无 | $9$ |
| $2$ | $10^6$ | $5 \times 10^6$ | A | $5$ |
| $3$ | $10^3$ | $10^4$ | 无 | $19$ |
| $4$ | $10^5$ | $10^5$ | 无 | $17$ |
| $5$ | $10^6$ | $10^6$ | B | $15$ |
| $6$ | $10^6$ | $10^6$ | 无 | $13$ |
| $7$ | $10^6$ | $5 \times 10^6$ | 无 | $22$ |
- 特殊性质 A:$p_i = i$;
- 特殊性质 B:$p$ 从所有 $1 \sim n$ 的排列中等概率随机生成。
对于所有数据,满足:
- $3 \le n \le 10^6$;
- $1 \le m \le 5 \times 10^6$;
- $0 \le seed, A, B, C < 2^{32}$;
- $p$ 是一个 $1 \sim n$ 的排列。