逆序对

所求的交换次数等价于满足\(i<j,a_i>a_j\)的\((i,j)\)的数对的个数(这种数对的个数叫做逆序数)。

可以利用树状数组来求解逆序对的问题

// Created by CAD on 2020/2/8.
#include <bits/stdc++.h>
#define lowbit(i) (i&-i)
using namespace std;

const int maxn=1e5+5;
int a[maxn],c[maxn],n;
void add(int x,int k){
while(x<=n)
c[x]+=k,x+=lowbit(x);
}
int getsum(int x){
int ans=0;
while(x>=1)
ans+=c[x],x-=lowbit(x);
return ans;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
int ans=0;
for(int i=1;i<=n;++i){
ans+=i-1-getsum(a[i]);
add(a[i],1);
}
cout<<ans<<endl;
}

CAD加油!欢迎跟我一起讨论学习算法,