CF2128E2 Submedians (Hard Version)

题目描述

这是该问题的困难版本。唯一的区别在于本版本中,你需要为所有的“子中位数”找到一个对应的子数组。 只有当你解决了两个版本的问题时,才能进行 hack。 对于一个长度为 $m$ 的数组 $b$,如果整数 $v$ 满足以下条件,则称 $v$ 是 $b$ 的中位数: - $v$ 大于等于数组中至少 $\lceil \frac{m}{2} \rceil$ 个元素,并且 - $v$ 小于等于数组中至少 $\lceil \frac{m}{2} \rceil$ 个元素。 例如: - $[9, 3, 7]$ 的唯一中位数是 $7$, - $[5, 3, 7, 9]$ 的中位数是 $5$、$6$ 和 $7$, - $[2, 2, 2]$ 的唯一中位数是 $2$。 给定一个整数 $k$ 和一个由 $1$ 到 $n$ 之间的整数构成的数组 $a_1, \ldots, a_n$。 如果存在至少一对下标 $(l, r)$ 满足: - $1 \leq l \leq r \leq n$, - $r - l + 1 \geq k$, - $v$ 是子数组 $[a_l, \ldots, a_r]$ 的中位数, 则称 $1$ 到 $n$ 之间的整数 $v$ 是一个“子中位数”。 请找出所有的子中位数,并且对于每一个子中位数,给出任意一组对应的下标对 $(l, r)$。

输入格式

每组测试数据包含多个测试用例。第一行为测试用例数 $t$($1 \le t \le 50\,000$)。接下来是每个测试用例的描述。 每个测试用例的第一行包含两个整数 $n$ 和 $k$($1 \leq k \leq n \leq 300\,000$)。 第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \leq a_i \leq n$)。 保证所有测试用例中 $n$ 的总和不超过 $300\,000$。

输出格式

对于每个测试用例,按如下格式输出答案。 第一行输出 $c$,即子中位数的个数。 接下来的 $c$ 行中,第 $i$ 行输出三个整数 $v_i$、$l_i$、$r_i$,满足: - $r_i - l_i + 1 \geq k$, - $v_i$ 是子数组 $[a_{l_i}, \ldots, a_{r_i}]$ 的一个中位数。 每个子中位数只需输出一次,即 $v_1, \ldots, v_c$ 必须互不相同。输出顺序不限。 如果有多种方案,可以输出任意一种。

说明/提示

在第一个测试用例中,长度至少为 $k = 3$ 的子数组有: - $(l = 1, r = 3)$:$[4, 1, 2]$,唯一的中位数是 $2$, - $(l = 2, r = 4)$:$[1, 2, 4]$,唯一的中位数是 $2$, - $(l = 1, r = 4)$:$[4, 1, 2, 4]$,中位数是 $2$、$3$ 和 $4$。 在第二个测试用例中,一种可能的输出为: - $(l = 4, r = 5)$:$[2, 1]$,中位数是 $1$ 和 $2$, - $(l = 1, r = 5)$:唯一的中位数是 $2$, - $(l = 3, r = 4)$:$[3, 2]$,中位数是 $2$ 和 $3$。 所有这些子数组的长度都至少为 $2$。注意可以证明,没有长度至少为 $2$ 的子数组的中位数为 $4$ 或 $5$。 由 ChatGPT 4.1 翻译