CF2143D2 Inversion Graph Coloring (Hard Version)

题目描述

这是该问题的困难版本。与其它版本的区别在于本版本中 $n \leq 2000$。只有在你解出了所有版本之后才可以进行 Hack。 我们称一个序列 $b_1, b_2, \ldots, b_k$ 是“好”的,如果存在一种对每个下标 $i$ 染为红色或蓝色的方式,使得对于每对满足 $i < j$ 且 $b_i > b_j$ 的下标 $i,j$,$i$ 和 $j$ 的颜色不同。 给定一个序列 $a_1, a_2, \ldots, a_n$,请你计算它的“好”子序列的数量,包括空子序列 $^\ast$。由于答案可能非常大,请输出答案对 $10^9 + 7$ 取模的结果。 $^\ast$ 如果序列 $b$ 能由序列 $a$ 通过删除若干(可能为零或全体)元素且保持原有顺序得到,则称 $b$ 是 $a$ 的一个子序列。

输入格式

每组测试数据包含多组测试用例。第一行输入一个整数 $t$($1 \leq t \leq 100$),表示测试用例的组数。 每组测试用例的第一行输入一个整数 $n$($1 \leq n \leq 2000$),表示序列的长度。 第二行输入 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \leq a_i \leq n$),表示序列中的元素。 保证所有测试用例中 $n$ 的总和不超过 $2000$。

输出格式

对于每组测试用例,输出一行一个整数,表示该序列“好”子序列的数量,对 $10^9 + 7$ 取模。

说明/提示

在第一个测试用例中,不是“好”的子序列有 $[4, 3, 1]$、$[4, 2, 1]$ 和 $[4, 2, 3, 1]$。由于总共有 $16$ 个子序列,所以“好”的子序列数量为 $16 - 3 = 13$。 在第三个测试用例中,所有子序列都是“好”的。 由 ChatGPT 5 翻译