其实,我也知道这道题是求逆序数来做的,
但是问题来了,怎么求逆序数,常规的解法肯定是不行的,因为数据量很大,
那么想到能用线段树来做,是可以的,不过我还没敲过,既然在看树状数组就用这个做。
又因为数据可以达到一百万,并且数据又用不到,所以可以对数据进行离散化
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define size 1000001
struct node
{
int num,index;
}list[size];
int c[size];
int num[size];
int cmp(node a,node b)
{
return a.num < b.num;
}
inline int lowbite(int x)
{
return x & (-x);
}
void add(int k,int n)
{
while(k <= n)
{
c[k]++;
k += lowbite(k);
}
}
int sum(int k)
{
int s = 0;
while(k)
{
s += c[k];
k -= lowbite(k);
}
return s;
}
int main()
{
int x,y,n,i;
__int64 ans;
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
list[i].index = i;
list[i].num = num[i];
}
sort(list+1,list+1+n,cmp);
for(i=1;i<=n;i++)//实现离散化,因为之前已经排过序,所以直接赋值i就算离散化了
{
num[list[i].index] = i;
}
ans = 0;
for(i=1;i<=n;i++)
{
add(num[i],n);
ans += i - sum(num[i]);
}
printf("%I64d\n",ans);
}
return 0;
}