题目大意:求一组数的逆序数有多少个;
题目解析: 用树状数组做,向下更新,向上求和,因为数据范围太大,但是每个数都不一样所以先离散化一下;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=500010;
ll d[maxn],a[maxn];
struct node
{
int val,pos;
}q[maxn];
int lowbit(int k)
{
return k&(-k);
}
int n,m;
void add(int x)
{
for(int i=x;i>=1;i-=lowbit(i))
{
d[i]++;
}
}
ll getsum(int w)
{
ll sum=0;
for(int i=w+1;i<=n;i+=lowbit(i))
{
sum+=d[i];
}
//cout<<sum<<endl;
return sum;
}
bool cmp(node a,node b)
{
return a.val<b.val;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i].val);
q[i].pos=i;
}
sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i++)
a[q[i].pos]=i;
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=getsum(a[i]);
add(a[i]);
}
printf("%lld\n",ans);
}
return 0;
}