- 母题–逆序对与期望
求长度为 n n n 的排列的期望的逆序对个数。
对于每一对数,是否成为逆序对的概率显然为 1 2 \frac{1}{2} 21,那么就有:
E ( x ) = E ( ∑ i , j ∣ i < j [ a i > a j ] ) = ∑ i , j ∣ i < j ( E ( [ a i > a j ] ) = ∑ i , j ∣ i < j 1 2 = n ( n − 1 ) 4 E(x) = E(\sum\limits_{i,j\mid i < j}[a_i > a_j])=\sum\limits_{i,j\mid i < j}(E([a_i > a_j]) = \sum\limits_{i,j\mid i < j} \frac{1}{2} = \frac{n(n-1)}{4} E(x)=E(i,j∣i<j∑[ai>aj])=i,j∣i<j∑(E([ai>aj])=i,j∣i<j∑21=4n(n−1)
- 变式 1 1 1 Another Shuffle Window
题意: 每次可以选择一个长度为 k k k 的连续区间进行重排,求期望的逆序对个数。
每次选择一对 ( a i , a j ) (a_i,a_j) (ai,aj) 去考虑是否可以产生贡献。对于一个长度固定的区间,可以分区间内和区间内外分别考虑。对于后者,无论区间内怎么重排,都可以直接计算出与区间外的逆序对数,像滑动窗口一样直接处理即可。
- 变式 2 2 2 Inversions After Shuffle
每次可以选择任意长度的连续区间进行重排,求期望的逆序对个数。
根据选择的 ( a i , a j ) (a_i,a_j) (ai,aj) 是否会产生贡献从而列出式子,并用数据结构维护。显然所有的区间数为 C n 1 + C n 2 = C n + 1 2 = n ( n + 1 ) 2 C_n^1 + C_n^2 = C_{n + 1}^2 = \frac{n(n + 1)}{2} Cn1+Cn2=Cn+12=2n(n+1),则对于这一对数(显然此时 i ≠ j i \neq j i=j),令 i < j i < j i<j,有 2 i ( n − j + 1 ) n ( n + 1 ) \frac{2i(n - j + 1)}{n(n + 1)} n(n+1)2i(n−j+1) 的概率被一个区间包含。而 ( a i , a j ) (a_i,a_j) (ai,aj) 又有 1 2 \frac{1}{2} 21 的概率成为逆序对。
若 a i , a j a_i,a_j ai,aj 被选中,则贡献的答案为
∑ i = 1 n ∑ j = i + 1 n 1 2 2 i ( n − j + 1 ) n ( n + 1 ) = ( 1 n ( n − 1 ) 2 + 2 ( n − 1 ) ( n − 2 ) 2 + ⋯ + n 1 × 0 2 ) × 1 n ( n + 1 ) = 1 2 n ( n + 1 ) ∑ i = 1 n i ( n − i + 1 ) ( n − i ) \sum \limits_{i = 1} ^ n \sum \limits_{j = i + 1}^n \frac{1}{2}\frac{2i(n - j + 1)}{n(n + 1)}\\ =(1 \frac{n(n - 1)}{2} + 2 \frac{(n - 1)(n - 2)}{2} + \cdots + n\frac{1 \times 0}{2}) \times \frac{1}{n(n + 1)}\\ = \frac{1}{2n(n + 1)} \sum \limits_{i = 1}^n i(n - i + 1)(n - i) i=1∑nj=i+1∑n21n(n+1)2i(n−j+1)=(12n(n−1)+22(n−1)(n−2)+⋯+n21×0)×n(n+1)1=2n(n+1)1i=1∑ni(n−i+1)(n−i)
若不被选中,则只有当 a i > a j a_i > a_j ai>aj 时才会产生贡献,答案为
∑ i = 1 n ∑ j = i + 1 n [ 1 − 2 i ( n − j + 1 ) n ( n + 1 ) ] [ a i > a j ] = ∑ i = 1 n ∑ j = i + 1 n [ a i > a j ] − 2 n ( n + 1 ) ∑ i = 1 n ( i ∑ j = i + 1 n ( n − j + 1 ) [ a i > a j ] ) \sum \limits_{i = 1}^n \sum \limits_{j = i + 1}^n [1 - \frac{2i(n - j + 1)}{n(n + 1)}] [a_i > a_j]\\ =\sum \limits_{i = 1}^n \sum \limits_{j = i + 1}^n [a_i > a_j] - \frac{2}{n(n + 1)}\sum \limits_{i = 1}^n (i\sum \limits_{j = i + 1}^{n}(n - j + 1)[a_i > a_j]) i=1∑nj=i+1∑n[1−n(n+1)2i(n−j+1)][ai>aj]=i=1∑nj=i+1∑n[ai>aj]−n(n+1)2i=1∑n(ij=i+1∑n(n−j+1)[ai>aj])
对于前者,直接循环维护即可。对于后者,用树状数组维护逆序对。但需要注意循环枚举应该从后往前,从而保证每次查询时在其之后的数的相对大小已存入树状数组中。
for (int i = n;i;--i)
{
sum += 1.0 * i * query (a[i]);
modify (a[i],n - i + 1);
}
- 变式 3 3 3 Inversion Expectation
题意:长度为 n n n 的排列中有一些数是不确定的,求该排列的逆序对。
分类讨论,共三种情况:
- 两个已知数构成逆序对 树状数组求解即可。
- 两个未知数构成逆序对 用母题的结论 n ( n − 1 ) 4 \frac{n(n - 1)}{4} 4n(n−1) 即可。
- 一个未知数,一个已知数 设已知数 a a a 前面的未知数个数为 k k k,比 a a a 大的未知数个数为 m m m,总共的未知数个数为 n n n,则此时的贡献为 k × m n k \times \frac{m}{n} k×nm。那么在后面的比 a a a 小的未知数的贡献同理。
题意: 初始时 a = [ 0 , 1 ] a = [0,1] a=[0,1],每次更新将 a a a 逆序对的数量 k k k 插入其中,求最终长度为 n n n 的序列的数量。
以下均设当前的序列逆序对的数量为 k k k。
首先需要通过观察得出一个性质,当序列第一次出现 k > 1 k > 1 k>1 的时候,若将 k k k 插在中间的位置,会使得 k ′ > k k' > k k′>k,在末尾插入则 k ′ = k k' = k k′=k。设 f i f_i fi 表示长度为 i i i 且当前第一次出现 k > 1 k > 1 k>1 时,变为长度为 n n n 的序列的数量。剩下还有 n − i n - i n−i 次操作,可以将 k k k 均插入末尾,或者在末尾插入若干个以后再将 k k k 插入中间的 i i i 个位置之一,因此可以得到以下转移:
f i = i × ∑ j = 0 n − i − 1 f i + j + 1 + 1 f_i = i \times \sum \limits_{j = 0}^{n - i - 1} f_{i + j + 1} + 1 fi=i×j=0∑n−i−1fi+j+1+1
现在我们讨论整一个序列均为 k ≤ 1 k \le 1 k≤1 的情况。显然 k = 0 k = 0 k=0 时就只有 00 ⋯ 0 ⏟ n − 1 1 \underbrace{00 \cdots 0}_{n - 1}1 n−1 00⋯01 这一种。而 k = 1 k = 1 k=1 时应为 00 ⋯ 0 ⏟ x 010 11 ⋯ 1 ⏟ n − x − 3 \underbrace{00 \cdots 0}_{x}010\underbrace{11\cdots1}_{n - x - 3} x 00⋯0010n−x−3 11⋯1,其中 x ∈ [ 0 , n − 3 ] x \in [0,n - 3] x∈[0,n−3],故有 n − 2 n - 2 n−2 种。所以说, k ≤ 1 k \le 1 k≤1 时,共有 n − 1 n - 1 n−1 种。
最后考虑 k ≤ 1 k \le 1 k≤1 转移至 k > 1 k > 1 k>1 的情况,显然只有 k = 1 k = 1 k=1 时才有可能。因此对于 00 ⋯ 0 ⏟ x 010 11 ⋯ 1 ⏟ n − x − 3 \underbrace{00 \cdots 0}_{x}010\underbrace{11\cdots1}_{n - x - 3} x 00⋯0010n−x−3 11⋯1 类型的串,我们需要找到第一个 1 1 1 所出现的位置。不难发现第一次出现 k > 1 k > 1 k>1 的序列时至少由长度为 3 3 3 的 010 010 010 转移而来,共会产生 2 2 2 个长度为 4 4 4 且 k > 1 k > 1 k>1 的串 1010 , 0110 1010,0110 1010,0110。一般化的,若在长度为 i i i 时第一次出现 k > 1 k > 1 k>1,则这个长度为 i i i 的串共会有 ∑ j = 2 i − 1 = i ( i − 3 ) 2 \sum \limits_{j = 2}^{i - 1} = \frac{i(i - 3)}{2} j=2∑i−1=2i(i−3) 种情况。举个例子,若 i = 5 i = 5 i=5,则可能由 0010 , 0101 0010,0101 0010,0101 转移出 5 5 5 种情况。
综上所述,最后的答案就是 n − 1 + ∑ i = 4 n i ( i − 3 ) 2 f i n - 1 + \sum \limits _{i = 4}^n \frac{i(i - 3)}{2} f_i n−1+i=4∑n2i(i−3)fi。直接后缀和进行处理即可,时间复杂度 O ( n ) O(n) O(n)。