逆序对的定义是,在一个数组中,对于下标 ( i ) 和 ( j )(其中 ( i < j )),如果 ( a[i] > a[j] ),则称 ((a[i], a[j])) 为数组的一个逆序对。
换句话说,逆序对就是在数组中前面的元素大于后面的元素的情况。例如,对于数组 ([3, 1, 2]),其中的逆序对有 ((3, 1)) 和 ((3, 2)),所以该数组有 2 个逆序对。
如何利用树状数组求逆序对
我们来看一个题目
我们首先需要离散化数据,然后先处理值大的数据,值相同的位置大的先处理
#include<bits/stdc++.h>
using namespace std;#define int long long
const int N = 500005;struct node{int va,pos;bool operator<(node ot){if(va>ot.va) return true;else if(va==ot.va ) return pos>ot.pos;return false;}
}b[N];
int a[N];
int n;int lowbit(int x){return x & (-x);
}void add(int x,int p){for(int i=x;i<=n;i+=lowbit(i)){a[i] += p;}
}int find(int x){if(x==0) return 0;return a[x]+find(x-lowbit(x));
}signed main(){cin >> n;for(int i=1;i<=n;i++){scanf("%d",&b[i].va );b[i].pos = i;}sort(b+1,b+1+n);int ans = 0;for(int i=1;i<=n;i++){ans += find(b[i].pos-1);add(b[i].pos,1);}cout << ans;return 0;
}