Cantor Expansion
定义
一种序列到自然数域的双射。
\[\begin{cases}
f(a)=\sum\limits_{i=1}^n A_i(n-i)!
\\
A_i=\sum\limits_{j=i}^n [a_j<a_i]
\end{cases}
\]
求解这类问题有两个入手角度:
- 逆序对类问题
- 进制类问题
进制角度:由于阶乘之间的相互独立性,事实上 \(A\) 序列可以被看作是一个进制串,只不过每一位进制都不一样(雾
逆序对角度:\(A\) 序列事实上就是 \(a\) 每一位的逆序对个数。
例题
逆康托展开:求出 \(A_i\) 后,得到了原 \(a\) 序列对应的逆序对,从左到右直接填数,用 \(\text{BIT}\) 或线段树维护即可。
利用康托展开转化为逆序对模型,然后算贡献。
CF501D Misha and Permutations Summation
先求出两个序列各自的 \(A_i\),合并的时候根据进制合并,然后用逆康托展开求出最终序列即可。
只维护最后 \(15\) 位的 \(A_i\),每次查询区间和时变换为排列计算即可。