经典题了
下面代码应该好懂
我用的是映射的离散化
注意先查询再插入
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
int n;
const int MAX_N = 500005;
int C[MAX_N*2],num[MAX_N],tp[MAX_N],ans[MAX_N],id[MAX_N];
map<int ,int > mp;
void change(int x){
for(;x<=n;x+=x&(-x))
C[x]++;
}
int getsum(int x){
int res = 0;
for(;x;x-=x&(-x))
res+=C[x];
return res;
}
int main(){
long long ans1 = 0;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&num[i]);
tp[i] = num[i];
}
sort(tp,tp+n);
int m = unique(tp,tp+n)-tp;
for(int i=0;i<m;++i){
mp[tp[i]]=i+1;
id[i+1] = tp[i];
}
for(int i=0;i<n;++i)
ans[i] = mp[num[i]];
for(int i=0;i<n;++i){
ans1+=(i-getsum(ans[i]));
change(ans[i]);
}
printf("%lld\n",ans1);
return 0;
}