康托展开:
- 一种从全排列到自然数(即排列名次)的双射函数。
- 公式:
,a[0]是指后面比首位数字小的数字个数,a[1]是指后面比第二位数字小的数字个数,其他同理,a[n-1]是0。本质其实是找比原数小的排列,所以保证数字小于各个位数字。
- 举例说明:“2431”,则a[0] = 1,比2小的数只有1,a[1] = 2,比4小的数有3、2、1,但是2出现过,所以a[1] = 2,同理,a[2] = 1,a[3] = 0;x = 1 * 3 ! + 2 * 2 ! + 1 * 1!+ 0 * 0!得x = 11,则“2431”排在第12位。
- 代码实现(线段树:复杂度O(nlogn)):
#define lowbit(x) x&(-x)
void update(int x)
{
while(x < maxn)
{
cnt[x] ++;
x += lowbit(x)