#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 70000;
int n, aa[maxn], c[maxn];
struct node
{
int num;
int ix;
}a[maxn];
bool cmp(node a, node b)
{
return a.num < b.num;
}
int lowbit(int x)
{
return x&-x;
}
void add(int x, int d)
{
while(x <= n)
{
c[x] += d;
x += lowbit(x);
}
}
int sum(int x)
{
int ret = 0;
while(x > 0)
{
ret += c[x];
x -= lowbit(x);
}
return ret;
}
int main()
{
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i].num);
a[i].ix = i;
}
sort(a+1, a+1+n, cmp);
aa[a[1].ix] = 1;
for(int i = 2; i <= n; i++)
{
if(a[i].num != a[i-1].num) aa[a[i].ix] = i;
else aa[a[i].ix] = aa[a[i-1].ix];
}
memset(c, 0, sizeof(c));
long long ans = 0;
for(int i = 1; i <= n; i++)
{
add(aa[i], 1);
ans += sum(n) - sum(aa[i]);
}
printf("%lld\n", ans);
}
}
SGU 180. Inversions 離散 + 樹狀數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.