百度:逆序对;
思路:树状数组;
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
const int MAX_N=500000+1;
int bit[MAX_N+1],n;
int a[MAX_N];
struct name{
int u,v;
}s[MAX_N];
bool comp(const name &a,const name &b){
return a.u<b.u;
}
int sum(int i){
int s=0;
while(i>0){
s+=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x){
while(i<=n){
bit[i]+=x;
i+=i&-i;
}
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
bit[i]=0;
cin>>s[i].u;
s[i].v=i;
}
sort(s+1,s+1+n,comp);
for(int i=1;i<=n;i++)
a[s[i].v]=i;//难理解 ,离散化的过程
ll ans=0;
for(int j=1;j<=n;j++){
add(a[j],1);
ans+=j-sum(a[j]);
}
printf("%lld\n",ans);
}
return 0;
}