详细见代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5000+7;
int c[maxn],a[maxn],n;
int lowbit(int x)
{
return x & (-x);
}
int add(int pos)
{
for(int i = pos; i <= maxn; i += lowbit(i))
c[i] += 1;
}
int getSum(int pos)
{
int ans = 0 ;
for(int i = pos; i >= 1; i -= lowbit(i))
ans += c[i];
return ans;
}
int main()
{
while(~scanf("%d", &n))
{
memset(c, 0,sizeof(c));
int ans = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%d",&a[i]);
add(a[i]);
ans += i - getSum(a[i]);
//这边 i表示的是当前的位置.... getSum(a[i])表示的是从之前到现在为止一共有多少个数是小于等于a[i]的
//所以相对应的 i- getSum(a[i])表示的就是之前到现在有多少个数是大于i的
}
printf("%d\n",ans);
}
return 0;
}