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,p_j,p_i \times 2,p_j \times 2, ... , p_i \times 2^{k-1} ,p_j \times 2^{k-1}] \]

那么这两行会产生的贡献为:

\[1+2+3+...+(k-1)+k=\frac{k*(k+1)}{2} \]

如果 \(p_i \times 2 < p_j < p_i \times 4\) , 那么排好序后的序列一定是

\[[p_i,p_i \times 2,p_j,p_i \times 4,p_j \times 2 ... , p_i \times 2^{k-1} ,p_j \times 2^{k-2} ,p_j \times 2^{k-1}] \]

那么这两行会产生的贡献为:

\[2+3+4+...+(k-1)+k+k=\frac{(k-1)(k+2)}{2}+k \]

推广一下,如果 \(p_i \times 2^x < p_j < p_i \times 2^{x+1}\) , 那么排好序后的序列一定是

\[[p_i,p_i \times 2,p_i \times 2^2,...,p_i \times 2^x,p_j,p_i\times 2^{x+1},p_j \times 2, ... , p_i \times 2^{k-1} ,p_j \times 2^{k-x-1} ,p_j \times 2^{k-x},...,p_j\times2^{k-1}] \]

那么这两行会产生的贡献为:

\[(x+1)+(x+2)+(x+3)+...+(k-1)+k+x*k=\frac{(k+x+1)(k-x)}{2}+x*k \]

对于 \(K>1\) 的部分可以类推。

显然,\(x \in [0,\log_2{2n-1}]\),因此我们只需要用树状数组维护前面已经出现过哪些数,枚举 \(x\) 即可。时间复杂度 \(O(nlogn)\)

posted @ 2025-07-16 13:59  XiaoZi_qwq  阅读(6)  评论(0)    收藏  举报