#include <iostream>
#include <string>
using namespace std;
const int N=1010;
int c[N];
int n;
int lowbit(int i)
{
return i&(-i);
}
int insert(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
return 0;
}
int query(int i)
{
int sum=0;
while(i)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
while(cin>>n)
{
int ans=0;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
insert(a,1);
ans+=i-query(a);
}
cout<<ans<<endl;
}
return 0;
}
这里(x&(-x))求出2^k(其中k: x 的二进制表示数中, 右向左数第一个1的位置)
C数组中元素C[ i ]表示A[ i –lowbit( i ) + 1]至A[ i ]的结合值。A[i]=1代表 整数i出现过