思路:
通过树状数组来计算逆序对(也可以用归并排序来计算逆序对)。
刚开始想的时候完全没思路,后来看了题解说是通过树状数组来计算逆序对,但是要先将原数组离散化。
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long int
const int MAXN=2e5+2;
int n;
int a[MAXN],b[MAXN],c[MAXN];
int lowbit(int x){
return x&-x;
}
void add(int pos,int x){
for(int i=pos;i<=n;i+=lowbit(i)){
c[i]+=x;
}
}
int sum(int pos){
int ans=0;
for(int i=pos;i>0;i-=lowbit(i)){
ans+=c[i];
}
return ans;
}
bool cmp(const int x,const int y){
if(a[x]==a[y])
return x>y;
return a[x]>a[y];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
b[i]=i;
}
sort(b+1,b+1+n,cmp);
LL ans=0;
for(int i=1;i<=n;++i){
add(b[i],1);
ans+=sum(b[i]-1);
}
printf("%lld\n",ans);
return 0;
}