离散化

3 -1 2 -2 这个数列有 5个逆序对

4 2 3 1 也是五个

我们把最小的-2视作1

第二的-1看做2

...

法一(推荐):

结构体保存数组num 和它在原数组里的下标

{3,1}{-1,2}{2,3}{-2,4}

然后按数字大小排序

{-2,4}{-1,2}{2,3}{3,1}

现在我们就得到了 4 2 3 1了。

for(int i=1;i<=n;i++)
    scanf("%d",&a[i].val),a[i].num=i;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
    rank[a[i].num]=i;

 

法二:

将原数组a复制得到b

将b排序,然后用二分去找a中的元素在b中的下标

for(int i=1;i<=n;i++)
    cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
n=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+n+1,a[i])-b;

 

posted @ 2021-10-08 20:14  T_X蒻  阅读(30)  评论(0编辑  收藏  举报