4042. 有效 K 个不同元素子数组 II 🔒
题目描述
给定一个长度为 n 的整数数组 nums 和一个整数 k。
同时给定整数 l0 和 r0,它们定义了第一个查询,以及一个整数 q,表示需要处理的查询总数。
如果一个 子数组 nums[li..ri] 满足以下条件,则称其为 有效 子数组:
- 它恰好包含
k个不同的数字,并且 - 其中每个不同数字出现的次数都是 偶数。
对于查询 0,令 l0 = l0,r0 = r0。
令 ansi 表示第 i 个查询的结果,其中:
- 如果
nums[li..ri]是有效子数组,则ansi = 1; - 否则
ansi = 0。
对于每个 i > 0,按照以下方式生成下一个查询:
- 如果
ansi-1 = 1,则令gi-1 = li-1 + ri-1;否则令gi-1 = ri-1 - li-1。 - 计算
li = (li-1 XOR gi-1) % n,以及ri = (ri-1 XOR gi-1) % n。 - 如果
li > ri,则交换二者。
返回一个布尔数组 ans,其中 ans[i] 在 ansi = 1 时为 true,否则为 false。
示例 1:
输入: nums = [1,2,2,1], k = 2, l0 = 1, r0 = 2, q = 2
输出: [false,true]
解释:
i | [li, ri] | 子数组 | 不同数字 | 出现次数 | 有效性判断 | ans[i] | [li+1, ri+1] |
|---|---|---|---|---|---|---|---|
| 0 | [1, 2] | [2, 2] | {2} → 1 | {2:2} | false:该子数组包含的不同数字少于 k 个。 | ans0 = 0 | g0 = 2 - 1 = 1 |
| 1 | [0, 3] | [1, 2, 2, 1] | {1,2} → 2 | {1:2,2:2} | true:该子数组恰好包含 k 个不同数字,并且每个数字出现的次数都是偶数。 | ans1 = 1 | - |
因此,ans = [false, true]。
示例 2:
输入: nums = [1,2,3,3,4], k = 1, l0 = 2, r0 = 3, q = 2
输出: [true,false]
解释:
i | [li, ri] | 子数组 | 不同数字 | 出现次数 | 有效性判断 | ans[i] | [li+1, ri+1] |
|---|---|---|---|---|---|---|---|
| 0 | [2, 3] | [3, 3] | {3} → 1 | {3:2} | true:该子数组恰好包含 k 个不同数字,并且每个数字出现的次数都是偶数。 | ans0 = 1 | g0 = 2 + 3 = 5由于 l1 > r1,交换二者,得到 [l1, r1] = [1, 2]。 |
| 1 | [1, 2] | [2, 3] | {2,3} → 2 | {2:1,3:1} | false:该子数组包含 2 个不同数字,而不是恰好 k = 1 个。 | ans1 = 0 | - |
因此,ans = [true, false]。
提示:
2 <= n == nums.length <= 5 × 1051 <= nums[i] <= 5 × 1051 <= k <= n0 <= l0 < r0 <= n - 11 <= q <= 5 × 105
解法
方法一
1 | |
1 | |
1 | |
1 | |