逆序对的定义是,在一个数组中,对于下标 ( 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;
}