#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;``
int tree[500005]={0};
int n;
struct ha
{
long long val,pai;
};
int lowbit(int h)
{
return h&(-h);
}
void add(int a,int b)
{
while(a<=n)
{
tree[a]+=b;
a+=lowbit(a);
}
}
int read(int a)
{
int ans=0;
while(a>0)
{
ans+=tree[a];
a-=lowbit(a);
}
return ans;
}
bool cmp(ha a,ha s)
{
return a.val<s.val;
}
ha a[500005];
int main()
{
while(cin>>n)
{
if(n==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].pai=i;
}
sort(a+1,a+n+1,cmp);
long long ans=0;
for(int i=1;i<=n;i++)
{
add(i,1);
}
for(int i=1;i<n;i++)
{
if(a[i].val!=a[i+1].val)
add(a[i].pai,-1);
ans+=read(a[i].pai);
}
add(a[n].pai,-1);
ans+=read(a[n].pai);
cout<<ans<<endl;
}
}
POJ 2299 树状数组求逆序对
最新推荐文章于 2020-02-29 13:21:59 发布