神金的做题记录

橘远是正确的。


02.02

AT_abc214_g [ABC214G] Three Permutations

直接做不好做,考虑容斥。考虑对每个点数 \(x\) 求钦定有 \(x\) 个点放到自己颜色的位置的方案数 \(f(x)\)

其余点显然任意排列,有个 \((n-x)!\) 的系数,那么问题变为这 \(x\) 个点每个点都只有一个或两个位置放,求不能放重复的方案数。

对于 \(p_i=q_i\)\(p_i\),显然情况唯一,直接转移。

对于其余的点,显然可以将他们分作若干条链和若干个环。简单手摸一下可得,一个环的方案数为 \(2\),一条长为 \(n\) 的链的方案数为 \(n+1\)

我们知道原序列可以分成若干个置换环,那么所有链都是从某些环里分割出来的,不在同一置换环的点不可能成链。这启示我们逐个置换环转移。

那么现在我们只需要知道一个环中选出一些不相邻的链的价值即可,且关心这些链的点数和,一种选法的价值为所有链链长加一之积。

转化一下,等价于将整个环划分成若干段,一种方案的价值为所有段段长之积,那么点数实际就是环长减去划分数(认为每段第一个点不选)。特殊处理一下首段和尾段连在一起的情况即可。直接做是 \(O(n^3)\) 的,考虑组合意义,相当于是每个段都要有一个小球,因此直接多开一维表示当前段是否有小球了即可做到 \(O(n^2)\),于是可以简单转移。

得到这个之后就可以直接跑背包了,每个环都直接枚举点数转移是 \(O(n^2)\) 的,因为总点数是 \(n\)

最后简单反演就做完了。

posted @ 2026-02-02 07:32  LastKismet  阅读(0)  评论(0)    收藏  举报