CF1917D 解题报告
CF1917D 解题报告
简要题意
给定一个长为 \(n\) 由 \(1\) 到 \(2n-1\) 中的奇数构成的排列 \(\{p_{n}\}\)(从 \(0\) 开始编号),和一个长为 \(k\) 由 \(0\) 到 \(k-1\) 构成的排列 \(\{q_k\}\)(从 \(0\) 开始编号)。现在有一个长为 \(n*k\) 的数列 \(\{a\}\),其每一项都满足 \(a_{i*k+j}=p_i \cdot 2^{q_j}\),请求出序列 \(\{a_{nk}\}\) 中的逆序对个数。
分析
首先,\(\{a_{nk}\}\) 可以被分成 \(k\) 行 \(n\) 列,每一行内的逆序对贡献都是确定的且等于 \({p}\) 中的逆序对个数,因此我们只需要不同行之间的贡献。
那么,我们对于两行 \(i\) 和 \(j\)(\(i < j\)) ,我们发现这两行中同一列的元素的比值 \(K\) 是确定的且 \(K=\frac{p_i}{p_j}\)。而且,在统计这种逆序对时,有一个极为重要的性质:因为保证了先后顺序,因此我们只需要关心大小关系即可。
既然要求大小关系,那么肯定要排序。对于每行内部,排序是简单的。对于已经排好序的两行,显然应该用归并排序。
那么我们考虑归并排序的过程:(假设 \(K < 1\))
如果 \(p_i < p_j < p_i \times 2\) 那么排好序后的序列一定是
那么这两行会产生的贡献为:
如果 \(p_i \times 2 < p_j < p_i \times 4\) , 那么排好序后的序列一定是
那么这两行会产生的贡献为:
推广一下,如果 \(p_i \times 2^x < p_j < p_i \times 2^{x+1}\) , 那么排好序后的序列一定是
那么这两行会产生的贡献为:
对于 \(K>1\) 的部分可以类推。
显然,\(x \in [0,\log_2{2n-1}]\),因此我们只需要用树状数组维护前面已经出现过哪些数,枚举 \(x\) 即可。时间复杂度 \(O(nlogn)\)。