题解:AT_agc030_f [AGC030F] Permutation and Minimum

简单题,但是别看错题意。

题意:很简单了,不再赘述,但是注意 \(B\)\(n\) 长序列不是 \(2n-1\) 长序列。

做法:

看到这个取 \(\min\) 我们肯定考虑从值域按方向 dp,但是不太确定的是我们从小往大还是从大往小,一般来说计数问题有些是可以先考虑如何判定的。

我们考虑如何判定一个 \(B\) 是合法的,对于两个都是确定的数,\(B\) 是确定的,直接扔掉这些位置;如果其中一个确定为 \(x\),若 \(x=B_i\) 则要求另一个数要大于 \(B_i\),如果 \(x\not = B_i\) 那么要求 \(x > B_i\);如果都不确定,则都要求 \(\ge B_i\),所以如果我们现在有一个确定的 \(B\),我们就可以按照值域从大往小进行判定。

那么我们也从大往小进行 dp,我们先扔掉那些确定的位置,同时对于两个都没有确定的位置,因为这些位置都可以随意交换,先算出来然后最后再乘上阶乘即可。

我们发现对于在原数组里出现过的数和没出现过的数,出现过的两个不能匹配在一起,但是没出现过的可以随意,我们考虑记下目前有多少个出现过的和没出现过的可匹配的数量。

\(dp_{i,x, y}\) 代表已经考虑了 \(\ge i\) 的数,目前有 \(x\) 个是在原数组中出现过的未匹配,\(y\) 个没出现过的未匹配。

然后直接考虑是匹配更小的数还是和已经有的数匹配就可以了。

posted @ 2025-08-16 13:51  LUlululu1616  阅读(10)  评论(0)    收藏  举报