2023-09-09
题目
[ARC154E] Reverse and Inversion
难度&重要性(1~10):9.5
题目来源
luogu
题目算法
数学
解题思路
Update :2023.8.28修改一处笔误
这是一道很妙的计数题,考试的时候没想到。
这道题我们首先会想到去化简一下式子 ,这很明显是要求逆序对,但是这个 就对我们来说有点棘手,所以很容易想到去将 拆开分别计算贡献:。
拆开之后我们就需要有一个主次关系,即以 或者 的视角来继续化简式子,这里我们以 的视角入手,我们需要找到 前面比 大的,以及后面比 小的差:
好了,现在我们已经将 的贡献拆开计算了,但是由于 和 的符号方向不同,我们也只能分开计算,如何才能将符号统一呢。很简单,只需要将 旋转一下。
由于题目说了 是一个 的排列,那么比 小于等于的数有多少个能,当然是 个啦。这样我们就得到:
这里 是好处理的,但是 不好处理,因为 的位置是不断在变化的。我们为了更好的处理就定义 表示 的最终所在位置,即 。
但由于 ,是没法暴力处理。因此需要用一个操作:将求和改为求期望位置。这个操作的意义感觉是由下文结果体现的。
我们考虑翻转操作的本质是什么。假设对于 位置的值,若要将其翻转到 。考虑有多少种操作可行
显然,翻转的中心就是 。
由于分类讨论显然很烦,所以我们就要尝试将它们合并。可以发现,当 时,,而 同理,所以两种情况是可以合并在一起为 的。然后,我们就会发现把 翻转到 的概率与翻转到 的概率是相等的,那么它的总贡献就是 平均期望位置就是 ,这样我们就将 的贡献给成功剔除了,而如果 没有进行翻转,则期望位置就是 ,不妨设 ,即一次操作不包括位置 的概率。
这样 的期望值我们就可以算出来了:
这样这道题我们就做出来了,时间复杂度为 ,可以通过,它唯一的复杂度瓶颈就在于快速幂。
感谢 @Populus_euphratica 和 @MoriyaSuwako 指出错误
完成状态
已完成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通