逆序数
题目大意:求给出序列的逆序对的个数
解题思路:有多种方法可以求解,这里我用的树状数组求解,数据范围比较大,离散化优化一下。
Code:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=500500;
int n,m,k;
ll a[maxn],sum[maxn],c[maxn]; //c数组用于离散化
int lowbit(int x){
return x&(-x);
}
void add(int x,ll w){
while(x<=n){
sum[x]+=w;
x+=lowbit(x);
}
}
ll ask(int x){
ll ans=0;
while(x>0){
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>a[i];
c[++cnt]=a[i]; //离散化
}
sort(c+1,c+1+cnt); //离散化
cnt=unique(c+1,c+1+cnt)-(c+1); //离散化
for(int i=1;i<=n;i++) a[i]=lower_bound(c+1,c+1+cnt,a[i])-c; //离散化
ll ans=0;
for(int i=1;i<=n;i++){
add(a[i],1);
ans+=(i-ask(a[i])); //在a[i]之前的比a[i]大的数的数量
}
cout<<ans<<endl;
return 0;
}