loading...

[AGC043D]Merge Triplets

AGC 的题都比较有情趣。

Description

对于一个长为 \(3n\) 的排列 \(a\),使用其生成等长的排列 \(p\),生成方法如下:

  • \(p\) 初始为空。
  • 将序列 \(a\) 等分成 \(n\) 段,第 \(k(0\le k<n)\) 段包含 \(a_{3k+1},a_{3k+2},a_{3k+3}\)
  • 定义 \(n\) 个指针,初始分别指向每段中的第 \(1\) 个元素,即 \(a_{3k+1}\)
  • 执行若干次下面的操作,直到所有指针均被销毁:寻找当前所有指针指向元素的最小的一个,将该元素放在 \(p\) 的最后面,并让指向该元素的指针右移 \(1\),若移出当前所在段,则销毁该指针。

求总共能生成出多少不同的 \(p\) 序列,对 \(m\) 取模。

\(1\le n\le 2000,10^8 \le m \le 10^9+7\)

Analysis

一个显然的思路方向是关心 \(p\) 能否被生成出来。不难发现,如果存在 \(i<j \land p_i > p_j\),那么 \(p_i,p_j\) 必定被分在原序列 \(a\) 的同一段中。

接下来又发现 \(p_i,p_j\) 必定还满足相邻或只隔了一个数(而且隔开的这个数也与他们在同一段内),这是一个必要条件。这个必要条件看上去非常迂蠢,因此找到 \(p\) 的前缀 \(\max\) 数组 \(h\),发现这个条件等价于 \(h\) 中连续段长度不超过 \(3\)

于是可以先将 \(p\) 的前缀 \(\max\) 数组日出来,分出 \(k\) 个段。

例如 \([3,1,2,4,6,5]\to[3,3,3,\mid 4 \mid 6, 6]\),构造 \(a=\lang 3, 1,2,4,6,5\rang\) 即可。

然后列着列着 \([3,1,4,2,6,5] \to [3,3 \mid 4,4 \mid 6,6]\),然后尝试构造,有这几条限制,\(3\)\(1\)\(4\)\(2\)\(6\)\(5\) 在同一个三元组中,然后仔细一瞧,哟,似了。由于三元组只有两个,所以每个二元段都必须要搞出第三个数,然而在该序列中全为 \(2\) 元段,所以搞不出单独的第三个数。

所以自然而然地想出 \(p\) 的前缀 \(\max\) 数组 \(k\) 个段中,长度为 \(2\) 的数量必须少于长度为 \(1\) 的数量,不然凑不出来了。

那么寻求普遍性,是不是所有满足这个条件的 \(p\) 一定存在一个 \(a\) 与之对应?

假设 \(s_i=\max\limits_{j\le i}\{p_j\}\)\(k_1\) 个长为 \(1\) 的连续段,\(k_2\) 个长为 \(2\) 的连续段。满足 \(k_1 \ge k_2\)

长为 \(3\) 的连续段对构造无影响(直接给它们放一块就可以听候安排了),可以不妨设不存在。

先尝试着消掉所有 \(2\) 连续段:假如存在一个 \(1\) 连续段排在他前/后,那么就组建一个 \(a\) 中的三元段,让该 \(2\) 连续段的前/后放上这个孤独的数。

剩下的 \(1\) 连续段直接按顺序排即可。

这样构造的合理性在于,由于是前缀最大值,单调递增,这样构造后一定会先将前缀最大值所在组按顺序干掉,只需考虑单个三元段中的顺序即可。

Solution

于是可以使用 \(\rm dp\),令 \(f_{i,j}(i\in[1,3n],j\in[-n,n])\) 为考虑到第 \(i\) 位,限制当前第 \(i\) 位为最后一个前缀 \(\max\) 连续段的末尾,\(1\) 段个数减 \(2\) 段个数为 \(j\) 的方案数。

转移

\[ f_{i,j}\overset{+}{\gets} \begin{cases} f_{i-1,j-1}&l_k=1\\ f_{i-2,j+1}\times(i-1) &l_k=2\\ f_{i-3,j}\times(i-1)\times(i-2) &l_k=3 \end{cases} \]

\(\mathrm{ans}=\displaystyle\sum_{j\ge0} f_{3n,j}\)

如果多加仔细观察的话,会发现此处的转移之所以如此之简单,还有一个重要的 \(\rm dp\) 思想,就是由于前面得到的 \(\rm dp\) 值是只考虑到第 \(x\) 位,填的是 \(1 \sim x\) 的数,转移到当前的第 \(i\) 位,显然这里也只填从 \(1 \sim i\),当前块第一个放的一定是 \(i\),第二个和第三个先钦定为 \(i-1,i-2\),再在前面找到数与之交换(也可不交换)由于 \(i-1,i-2\) 均是大于前面的数的,所以对合法性无影响。

posted @ 2025-05-13 20:49  goldspade  阅读(12)  评论(0)    收藏  举报