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修改一处笔误

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

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

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

\[\begin{aligned}&\sum\limits_{i=1}^ni\sum\limits_{j=1}^{i-1}[p_i<p_j]-\sum\limits_{i=1}^ni\sum\limits_{j=i+1}^n[p_i>p_j]\\ = & \sum\limits_{i=1}^ni\left(\sum\limits_{j=1}^{i-1}[p_i<p_j]-\sum\limits_{j=i+1}^n[p_i>p_j]\right)\end{aligned} \]

好了,现在我们已经将 \(j-i\) 的贡献拆开计算了,但是由于 \([p_i<p_j]\)\([p_i>p_j]\) 的符号方向不同,我们也只能分开计算,如何才能将符号统一呢。很简单,只需要将 \(\sum\limits_{j=1}^i[p_i<p_j]\) 旋转一下。

\[\begin{aligned}& \sum\limits_{i=1}^ni\left(\sum\limits_{j=1}^{i-1}[p_i<p_j]-\sum\limits_{j=i+1}^n[p_i>p_j]\right)\\=& \sum\limits_{i=1}^ni\left(\sum\limits_{j=1}^i[p_i<p_j]-\sum\limits_{j=i+1}^n[p_i\ge p_j]\right)\\= & \sum\limits_{i=1}^ni\left(\left(i-\sum\limits_{j=1}^i[p_i>p_j]\right)-\sum\limits_{j=i+1}^n[p_i>p_j]\right)\\= &\sum\limits_{i=1}^ni\left(i-\sum\limits_{j=1}^n[p_i>p_j]\right)\end{aligned} \]

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

\[\begin{aligned} &\sum\limits_{i<j,p_i>p_j}(j-i)\\=& \sum\limits_{i=1}^ni(i-p_i)\\=& \sum\limits_{i=1}^ni^2-p_i\times i\end{aligned} \]

这里 \(i^2\) 是好处理的,但是 \(p_i\times i\) 不好处理,因为 \(p_i\) 的位置是不断在变化的。我们为了更好的处理就定义 \(w_i\) 表示 \(p_i\) 的最终所在位置,即 \(\sum\limits_{i=1}^ni^2-p_i\times w_i\)

但由于 \(m\le 2\times 10^5\),是没法暴力处理。因此需要用一个操作:将求和改为求期望位置。这个操作的意义感觉是由下文结果体现的。

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

显然,翻转的中心就是 \(\dfrac{i+j}{2}\)

  • \(i<j\) 时,方案数为 \(\min(i,n-j+1)\)
  • \(i>j\) 时,方案数为 \(\min(j,n-i+1)\)

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

这样 \(w_i\) 的期望值我们就可以算出来了:

\[w_i=k^m\times i+(1+k^m)\times \frac{n+1}{2} \]

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

感谢 @Populus_euphratica 和 @MoriyaSuwako 指出错误

完成状态

已完成

posted @ 2023-10-05 17:13  OIerBoy  阅读(6)  评论(0编辑  收藏  举报