版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30986521/article/details/82707630
求逆序数
不能简单的构造一个长度为999999999的树状数组,内存爆炸,要转换为id的逆序数,长度50000,可以接受
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 500010
struct node
{
int x;
int id;
friend bool operator < (node a, node b)
{
return a.x < b.x;
}
};
node a[N];
long long r[N];
int lowbit(int x)
{
return x & -x;
}
long long getsum(int k)
{
long long sum = 0;
while (k)
{
sum += r[k];
k -= lowbit(k);
}
return sum;
}
void update(int k)
{
while (k <= N)
{
r[k]++;
k += lowbit(k);
}
}
int main()
{
int n ;
while (scanf("%d", &n) && n)
{
memset(a, 0, sizeof(a));
memset(r, 0, sizeof(r));
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i].x);
a[i].id = i;
}
sort(a + 1, a + 1 + n);
long long ans = 0;
for (int i = n; i >= 1; i--)
{
ans += getsum(a[i].id);
update(a[i].id);
}
printf("%lld\n", ans);
}
return 0;
}