离散化
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;