求序列正序对的个数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500005;
long long a[maxn],data[maxn];
int c[maxn];
int n;
void lisan()//离散化
{
memset(data,0,sizeof(data));
for(int i=0;i<n;i++)
data[i]=a[i];
sort(data,data+n);
int cc=unique(data,data+n)-data;
for(int i=0;i<n;i++)
a[i]=1+lower_bound(data,data+cc,a[i])-data;
}
int lowbit(int x)
{
return x&-x;
}
void update(int x,int add)
{
while(x<=maxn)
{
c[x]+=add;
x+=lowbit(x);
}
}
long long sum(int x)
{
long long ret=0;
while(x)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
lisan();
// for(int i=0;i<n;i++)
// cout<<a[i]<<endl;
long long ans=0;
for(int i=0;i<n;i++)
{
update(a[i],1);
ans+=(i+1-sum(a[i]));
//cout<<i-sum(a[i]-1)-1<<endl;
}
printf("%lld\n",ans);
}
return 0;
}