树状数组求逆序数,套模板过,上代码,注意当变动某一个节点,只是它上面的节点变化,下面的节点没变,这样一步步减出来,就是最后的逆序总数
#include <iostream>
#include <string.h>
using namespace std;
int c[1005],n;
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int sum)
{
while (x<=n)
{
c[x]+=sum;
x+=lowbit(x);
}
}
int get_sum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int ans,a,count;
while (scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
int nu=n;
count=ans=0;
while(nu--)
{
scanf("%d",&a);
update(a,1);
ans+=(++count-get_sum(a));//count 本质上代表下标,下标与前面节点的差,正好为逆序数
}
printf("%d\n",ans);
}
return 0;
}