Loading

【题解】AGC023E Inversions

考虑一对数的贡献,注意到这样的话剩下的数的方案数因为上界变得不好计算,考虑先将 \(a_i\) 从小到大排序,然后将选排列看作从左往右选数,就可以解决上述问题。

\(b_i\) 表示 \(a_i\) 排序后的结果,\(c_i\) 表示 \(b_i\) 在原序列的哪个位置,不难发现一对数 \((i,j),i<j\) 的贡献为:

  • 如果 \(c_i<c_j\)

    \[{b_i-i+1\choose 2}\prod_{k=1}^{i-1}(b_k-k+1)\prod_{k=i+1}^{j-1}(b_k-k)\prod_{k=j}^{n}(b_k-k+1)\\ =\frac{b_i-i}{2(b_j-j+1)}\prod_{k=1}^{n}(b_k-k+1)\prod_{k=i+1}^{j-1}\frac{b_k-k}{b_k-k+1} \]

  • 如果 \(c_i>c_j\) :则除了考虑上述情况外,还需要讨论 \(p_j>b_i\) 的情况的贡献:

    \[\prod_{k=1}^{i}(b_k-k+1)\prod_{k=j+1}^{n}(b_k-k+1)\left(\sum_{t=b_i+1}^{b_j}\prod_{k=i+1}^{j-1}(b _k-k+[t> b_k])\right)\\ =\prod_{k=1}^{n}(b_k-k+1)\left(\frac{1}{b_j-j+1}\sum_{t=b_i+1}^{b_j}\prod_{k=i+1,t\leq b_k}^{j-1}\frac{b _k-k}{b_k-k+1}\right) \]

第一部分的贡献很好计算,关键在于第二部分:

\[\frac{1}{b_j-j+1}\sum_{t=b_i+1}^{b_j}\prod_{k=i+1,t\leq b_k}^{j-1}\frac{b _k-k}{b_k-k+1} \]

不妨考虑枚举 \(j\),维护 \(i\) 的贡献。从 \(j\) 推到 \(j+1\) 的时候考虑把贡献拆开为 \((b_i,b_j],(b_j,b_{j+1}]\) 两部分,第一部分是原贡献乘上 \(\frac{b_j-j}{b_j-j+1}\),第二部分的贡献就是直接加上 \(b_{j+1}-b_j\),以 \(c_i\) 为下标用线段树维护即可。

代码:Submission #25854261 - AtCoder Grand Contest 023

posted @ 2021-09-15 09:36  Qiuly  阅读(70)  评论(0)    收藏  举报