刚学树状数组,想起之前有道求逆序数的题,找到a之.
题意:求逆序数,n=500000,大小10e9.
hint:
1.逆序数会爆int,用ll,被坑了好几个WA.
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int a[500001];
int c[500001];
long long int cnt;
struct node{
int po;
int val;
}rec[500001];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int s=0;
while(x)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
void update(int x)
{
while(x<=500001)
{
c[x]++;
x+=lowbit(x);
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(rec,0,sizeof(rec));
for(int i=1;i<=n;i++)
{
scanf("%d",&rec[i].val);
rec[i].po=i;
}
sort(rec+1,rec+1+n,cmp);
for(int i=1;i<=n;i++)
{
a[rec[i].po]=i;
}
//for(int i=1;i<=n;i++)
// printf("%d\n",a[i]);
cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=(i-1-sum(a[i]));
update(a[i]);
}
//for(int i=2;i<=n;i++)
//{
// if()
//}
printf("%lld\n",cnt);
}
return 0;
}