首先说一下逆序对的定义,就是在一个数字数组里面,如果后面的数大于前面的数,被称为一个逆序对
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
const int MAX=50005;
struct Node
{
int val;
int pos;
}node[MAX];
int c[MAX],reflect[MAX],n;
bool cmp(Node a,Node b)
{
return a.val<b.val;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x)
{
while(x<=n)
{
c[x]+=1;
x=x+lowbit(x);
}
return;
}
int getsum(int now)
{
int sum=0;
while(now>0)
{
sum+=c[now];
now-=lowbit(now);
}
return sum;
}
int main()
{
int ans,i;
while(~scanf("%d",&n)&&n)
{
ans=0;
for(i=1;i<=n;i++)
{
scanf("%d",&node[i].val);
node[i].pos=i;
}
sort(node+1,node+n+1,cmp);
for(i=1;i<=n;i++)
reflect[node[i].pos]=i; //reflect[实际位置]=排序后应该在的位置
for(i=1;i<=n;i++)
c[i]=0;
for(i=1;i<=n;i++)
{
update(reflect[i]);
ans+=i-getsum(reflect[i]);//getsum()得到顺序排列在前面的个数(包括自己),总的个数-顺序个数=逆序个数(比自己小但是排在了后面)
}
cout << ans << endl;
}
return 0;
}