数据结构——康托展开
含义 康托展开是一个 全排列 到一个 自然数 的 双射 ,常用于构建 哈希表 时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是 可逆 的。 原理 X = s 1 (n-1)! + s 2 (n-2)! + s 3 (n-3)! + …… + s n-1 * 1! + s n * 0! 其中s i 表示在第i位右边比a i 小的数的个数。 我们现在用s l 表示第i位左边比a i 小的数的个数,s r 表示第i位右边比a i 小的数的个数,显然可以得到如下等式: a i = s l + s r + 1 故公式中的si可以用上述等式计算:s r = a i - s l -1 依照上述原理,则{1,2,3,4,5}的一种全排列{3,4,1,5,2}可以映射为{2,2,0,1,0} 根据公式,该集合实际上表示的就是一个变进制数。 简便计算:X = ((s 1 * (n-1) + s 2 ) * (n-3) + s 3 ) * (n-3) + …… 康托展开 暴力 O(n 2 ): 为了便于讲解下面的线段树优化,此处选择维护vis数组的方式(当然直接比大小也是一样的)。 vis[j]用以记录j是否已出现,未出现为0,已出现为1。故a[i]左边比其小的数的个数就是vis[j]的和(j<a[i])。 计算ans时