树状数组求逆序数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<array>
using namespace std;
const int maxn=10100;
int n;
array<int,maxn>c;
template<typename T>
void add(T i,T x)
{
while(i<=n)
{
c[i]+=x;
i+=i&(-i);
}
}
template<typename T>
T sum(T i)
{
T k(0);
while(i>0)
{
k+=c[i];
i-=i&(-i);
}
return k;
}
template<typename T>
void chu(T &c)
{
for(int i=0;i<=maxn;i++)
c[i]=0;
}
int main()
{
while(~scanf("%d",&n))
{
chu(c);
int ans(0),a;
for(int i=0; i<n; i++)
{
scanf("%d",&a);
ans+=sum(n)-sum(a-1);
add(a,1);
}
printf("%d\n",ans);
}
return 0;
}