info: { blogIcon: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogUser: 'OIerBoy', blogAvatar: 'https://cdn.luogu.com.cn/upload/usericon/765493.png', blogStartDate: '2023-04-22', webpageTitleOnblur: '(o?v?)ノ Hi', webpageTitleOnblurTimeOut: 1000, webpageTitleFocus: '(*′?`*) 欢迎回来!', webpageTitleFocusTimeOut: 1000, webpageIcon: "https://cdn.jsdelivr.net/gh/BNDong/Cnblogs-Theme-SimpleMemory@master/img/webp/blog_logo.webp", { enable: true, // 是否开启日/夜间模式切换按钮 auto: { // 自动切换相关配置 enable: false, // 开启自动切换 dayHour: 5, // 日间模式开始时间,整数型,24小时制 nightHour: 19 // 夜间模式开始时间,整数型,24小时制 } } },

[ARC154E] Reverse and Inversion

2023-09-09

题目

[ARC154E] Reverse and Inversion

难度&重要性(1~10):9.5

题目来源

luogu

题目算法

数学

解题思路

Update :2023.8.28修改一处笔误

这是一道很妙的计数题,考试的时候没想到。

这道题我们首先会想到去化简一下式子 i<j,pi>pj(ji),这很明显是要求逆序对,但是这个 (ji) 就对我们来说有点棘手,所以很容易想到去将 i,j 拆开分别计算贡献:i<j,pi>pjji<j,pi>pji

拆开之后我们就需要有一个主次关系,即以 i 或者 j 的视角来继续化简式子,这里我们以 i 的视角入手,我们需要找到 i 前面比 pi 大的,以及后面比 pi 小的差:

i=1nij=1i1[pi<pj]i=1nij=i+1n[pi>pj]=i=1ni(j=1i1[pi<pj]j=i+1n[pi>pj])

好了,现在我们已经将 ji 的贡献拆开计算了,但是由于 [pi<pj][pi>pj] 的符号方向不同,我们也只能分开计算,如何才能将符号统一呢。很简单,只需要将 j=1i[pi<pj] 旋转一下。

i=1ni(j=1i1[pi<pj]j=i+1n[pi>pj])=i=1ni(j=1i[pi<pj]j=i+1n[pipj])=i=1ni((ij=1i[pi>pj])j=i+1n[pi>pj])=i=1ni(ij=1n[pi>pj])

由于题目说了 p 是一个 1n 的排列,那么比 pi 小于等于的数有多少个能,当然是 pi 个啦。这样我们就得到:

i<j,pi>pj(ji)=i=1ni(ipi)=i=1ni2pi×i

这里 i2 是好处理的,但是 pi×i 不好处理,因为 pi 的位置是不断在变化的。我们为了更好的处理就定义 wi 表示 pi 的最终所在位置,即 i=1ni2pi×wi

但由于 m2×105,是没法暴力处理。因此需要用一个操作:将求和改为求期望位置。这个操作的意义感觉是由下文结果体现的。

我们考虑翻转操作的本质是什么。假设对于 i 位置的值,若要将其翻转到 j。考虑有多少种操作可行

显然,翻转的中心就是 i+j2

  • i<j 时,方案数为 min(i,nj+1)
  • i>j 时,方案数为 min(j,ni+1)

由于分类讨论显然很烦,所以我们就要尝试将它们合并。可以发现,当 i<j 时,ni+1>nj+1,而 i>j 同理,所以两种情况是可以合并在一起为 min(i,ni+1,j,nj+1) 的。然后,我们就会发现把 i 翻转到 j 的概率与翻转到 nj+1 的概率是相等的,那么它的总贡献就是 nj+1+j=n+1 平均期望位置就是 n+12,这样我们就将 i,j 的贡献给成功剔除了,而如果 i 没有进行翻转,则期望位置就是 i,不妨设 k=Ci2+Cni+12Cn+12,即一次操作不包括位置 x 的概率。

这样 wi 的期望值我们就可以算出来了:

wi=km×i+(1+km)×n+12

这样这道题我们就做出来了,时间复杂度为 O(nlogm),可以通过,它唯一的复杂度瓶颈就在于快速幂。

感谢 @Populus_euphratica 和 @MoriyaSuwako 指出错误

完成状态

已完成

posted @   OIerBoy  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示