CF1761F2 Anti-median (Hard Version)

题目描述

这是该问题的困难版本。两个版本的唯一区别在于 $n$ 的约束条件。只有在所有版本的问题都被解决后,你才能进行 hack。 我们称一个长度为 $2m+1$($m \ge 1$)的数组 $a$ 为“坏的”,如果元素 $a_{m+1}$ 等于该数组的中位数。换句话说,如果将数组排序后,第 $m+1$ 个位置上的元素与原来相同,则该数组为“坏的”。 我们称从 $1$ 到 $n$ 的一个排列 $p$ 为“反中位数排列”,如果它的每一个长度不小于 $3$ 的奇数长度子数组都不是“坏的”。 你已经知道排列中某些元素的值。请你计算有多少种填充未知元素的方法,使得得到的排列是“反中位数排列”。由于答案可能很大,请输出对 $10^9+7$ 取模后的结果。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的第一行包含一个整数 $n$($2 \le n \le 10^6$),表示排列的长度。 每个测试用例的第二行包含 $n$ 个整数 $p_1, p_2, \ldots, p_n$($1 \le p_i \le n$,或 $p_i = -1$),表示排列的元素。如果 $p_i \neq -1$,则该元素已知,否则未知。保证对于任意 $i \neq j$,若 $p_i \neq -1$ 且 $p_j \neq -1$,则 $p_i \neq p_j$。 保证所有测试用例中 $n$ 的总和不超过 $10^6$。

输出格式

对于每个测试用例,输出一个整数,表示填充未知元素使其成为“反中位数排列”的方案数,对 $10^9+7$ 取模。

说明/提示

在第一个测试用例中,$[1, 2]$ 和 $[2, 1]$ 都是反中位数排列。 在第二个测试用例中,排列 $[1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]$ 都是反中位数排列。剩下的两个排列 $[1, 2, 3]$ 和 $[3, 2, 1]$ 本身就是“坏的”,因为它们的中位数 $2$ 恰好在中间。 在第三个测试用例中,$[1, 2, 3, 4]$ 不是反中位数排列,因为它包含了“坏的”子数组 $[1, 2, 3]$。 在第四个测试用例中,唯一可以得到的反中位数排列是 $[5, 6, 3, 4, 1, 2]$。 由 ChatGPT 4.1 翻译