P4778 Counting Swaps

题意:给定一个 1n 的排列 a。每次可以选两个位置 i,j,耗费 1 的代价交换 ai,aj。问使得 a 升序排列的最小代价是多少,以及方案数。1n105

求最小代价:连边 iai,得到若干个环。一个大小为 x 的环需要 x1 次操作消除。答案就是每个环的大小 1 之和。

这个结论会用到一个引理:k 大小的环至少 k1 次操作变成 k 个自环。这可以用数学归纳法证明。

然后是方案数。令 fi 表示大小为 i 的环变成 i 个自环的方案数。初值 f1=0

一次操作可以把 i 大小的环拆成两个大小为 x,y 的环,要求 x+y=i。然后考虑有多少种方法拆出 x,y 两个环。注意到如果 x=y,方案数为 i/2;否则方案数为 i。记 T(x,y)=(12)[x=y]i。最后,两个环各自变成自环的操作可以随意排列。

于是有 fi=x+y=ifxfyT(x,y)i2(x1)!(y1)!

先求出 f[]。假设图中有环,长度为 L1,L2,,Lk。则总方案数为: ans=(i=1kf[Li])((nk)!i=1k(Li1)!)

ans 在预处理 f 后,用快速幂等方法可以做到接近线性。而复杂度瓶颈在于求 f。复杂度为 O(n2logn)

以上是本题一半的解法,也是比较合理的思路。如果使用分治 FFT 等黑科技优化,可能可以通过本题。但是这里有一个更优美的做法。

一个毫无理由的观察f[n]=nn2。下面给出这个结论的组合意义证明。

证明:

posted @   FLY_lai  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示