#CF2139D. Antiamuny 想学习交换
Antiamuny 想学习交换
D. Antiamuny 想学习交换
每个测试的时间限制:2 秒
每个测试的内存限制:512 兆字节
对于一个长度为 (m) 的数组 (b),你可以执行以下两种操作:
- 选择一个下标 (1 \le i \le m - 1),然后交换 (b_i) 和 (b_{i+1}) 的值。
- 选择一个下标 (1 \le i \le m - 2),然后交换 (b_i) 和 (b_{i+2}) 的值。
但操作 2 最多只能使用一次。
我们定义:
- (f(b)) 为对数组 (b) 进行非降序排序所需的最少操作次数(可以使用操作 1 和操作 2)。
- (g(b)) 为对数组 (b) 进行非降序排序所需的最少操作次数(只能使用操作 1)。
如果 (f(b) = g(b)),则称数组 (b) 是 完美的。
换句话说,即使允许使用操作 2,也不能比只用操作 1 的排序次数更少。
你有一个长度为 (n) 的排列 (a),需要回答 (q) 个查询。
每个查询包含两个整数 (l) 和 (r)((1 \le l \le r \le n)),表示子数组 (a[l \dots r])。
对每个查询,判断该子数组 (a[l \dots r]) 是否是完美的。
输入格式
每个测试包含多个测试用例。第一行包含测试用例的数量 (t)((1 \le t \le 5 \cdot 10^4))。
每个测试用例的描述如下:
- 第一行包含两个整数 (n, q)((1 \le n, q \le 5 \cdot 10^5))—— 数组 (a) 的长度和查询数量。
- 第二行包含 (n) 个整数 (a_1, a_2, \dots, a_n)((1 \le a_i \le n))—— 排列 (a) 中的元素。
- 接下来 (q) 行,每行包含两个整数 (l, r)((1 \le l \le r \le n))—— 查询的子数组的左右端点。
保证:所有测试用例的 (n) 之和与 (q) 之和均不超过 (5 \cdot 10^5)。
输出格式
对每个测试用例,如果查询的子数组 (a[l \dots r]) 是完美的,输出 "YES",否则输出 "NO"。
输出大小写不敏感(例如 "yEs", "yes", "Yes", "YES" 均视为肯定回答)。
示例
输入
2
5 5
1 5 4 3 2
1 2
1 5
3 5
1 4
2 5
5 5
3 2 1 4 5
1 1
4 5
1 4
2 5
3 4
输出
YES
NO
NO
NO
NO
YES
YES
NO
YES
YES
注释
第一个测试用例:
- 查询 1:(a[1 \dots 2] = [1, 5]) 已经是非降序的。所以 (f = g = 0),完美。
- 查询 2:(a[1 \dots 5] = [1, 5, 4, 3, 2])。
可以用以下操作序列在 4 步内排序:
[ [1,5,4,3,2] \xrightarrow{\text{op2}} [1,3,4,5,2] \xrightarrow{\text{op1}} [1,3,4,2,5] \xrightarrow{\text{op1}} [1,3,2,4,5] \xrightarrow{\text{op1}} [1,2,3,4,5] ]
而 (g = 6)(至少需要 6 次相邻交换)。
因为 (f \ne g),所以不完美。 - 查询 3:(a[3 \dots 5] = [4,3,2])。
可以用 1 步排序:
[ [4,3,2] \xrightarrow{\text{op2}} [2,3,4] ]
而 (g = 3)(至少需要 3 次相邻交换)。
因为 (f \ne g),所以不完美。