思路:典型的树状数组求逆序对,需要离散化并且数字可能有重复的
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn = 70000+50;
LL c[maxn];
int a[maxn],b[maxn];
vector<int>v;
int getid(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}
int lowbit(int x){return x&(-x);}
int n;
void update(int i,int num)
{
while(i<=maxn)
{
c[i]+=num;
i+=lowbit(i);
}
}
LL query(int x)
{
LL ans = 0;
while(x)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d",&n);
{
memset(c,0,sizeof(c));
v.clear();
for(int i = 1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
v.push_back(a[i]);
}
sort(b+1,b+1+n);
for(int i = 1;i<=n;i++)
a[i]=lower_bound(b+1,b+1+n,a[i])-b;
//v.push_back(maxn);
//sort(v.begin(),v.end());
//v.erase(unique(v.begin(),v.end()),v.end());
LL ans = 0;
for(int i = 1;i<=n;i++)
{
update(a[i],1);
ans+=a[i]-query(a[i]-1)-1;
// ans+=query((maxn))-query((a[i]));
//update((a[i]),1);
}
printf("%I64d\n",ans);
}
}