AtCoder AGC023E Inversions

题目传送门
考虑怎么求有限制的排列个数:将数组\(a\)从小到大排序,\(a_i\)在排序后数组中的位置是\(p_i\),则排列个数是\(\prod_{i=1}^{n}(a_i-p_i+1)\)。其意义就是考虑在排序后的限制中从前往后填数,第\(i\)个可填的数的个数就是\(a_i-p_i+1\)
对于这种逆序对计数问题的处理基本上都是要拆贡献,即对于每两位计算前一个比后一个大的方案数。
考虑任意两位\(i,j\ (i<j)\),记\(mul=\prod_{i=1}^{n}(a_i-p_i+1)\),分两类讨论:
1.\(a_i<a_j\),则方案数\(\frac{mul}{(a_i-p_i+1)(a_j-p_j+1)}\cdot \frac{(a_i-p_i+1)(a_i-p_i)}{2}\prod_{p_i < p_k < p_j}\frac{a_k-p_k}{a_k-p_k+1}\),解释一下其意义:第1项代表排除\(i,j\)两个数以外的数组成排列的方案数,第2项表示第\(i\)项有\(a_i-p_i+1\)个数可填\(P_i>P_j\)的方案数,第3项表示由于第\(j\)\(<a_i\)会导致\(a\)介于两者之间的能填的数个数\(-1\)。化简一下即可得到\(\frac{mul(a_i-p_i)}{2(a_j-p_j+1)}\prod_{p_i < p_k < p_j}\frac{a_k-p_k}{a_k-p_k+1}\)
2.\(a_i>a_j\),同理可得方案数为\(mul-\frac{mul(a_j-p_j)}{2(a_i-p_i+1)}\prod_{p_j < p_k < p_i}\frac{a_k-p_k}{a_k-p_k+1}\)
维护比较简单,只要从小到大加入\(a_i\),分别统计\(<i\)\(>i\)两部分的答案,线段树维护即可。
Submission
统计逆序对问题中有一个很常见的技巧,就是将其变成平面上的数点问题。
\(\text{Example1}\):在此题中当求\(a_i<a_j\)\(P_i>P_j\)的方案数时,本质上就是在平面直角坐标系中以\((0,0)\)为左下角点、\(a_i,a_j\)为宽和高的矩形中横坐标\(>\)纵坐标的整点个数,即在直线\(y=x\)下方的整点个数。
\(\text{Example2}\):当求在\([l_1,r_1]\)\([l_2,r_2]\)随机实数且\(P_i>P_j\)的概率是,等价于在矩形\((l_1,l_2),(r_1,r_2)\)中在直线\(y=x\)下方的面积大小除以矩形的面积,这样就可以很方便的容斥。

posted @ 2021-09-27 22:35  徐骁远  阅读(57)  评论(0)    收藏  举报