180. Inversions
time limit per test: 0.25 sec.
memory limit per test: 4096 KB
memory limit per test: 4096 KB
input: standard
output: standard
output: standard
There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount of such pairs (i, j) that 1<=i<j<=N and A[i]>A[j].
Input
The first line of the input contains the number N. The second line contains N numbers A1...AN.
Output
Write amount of such pairs.
Sample test(s)
Input
5
2 3 1 5 4
2 3 1 5 4
Output
3
离散化+树状数组
离散化+树状数组
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 70000;
__int64 bintree[N];
int xis[N];
int arr[N];
int cnt;
int lowbit(int x)
{
return x & (-x);
}
void add(int x)
{
for (int i = x; i <= cnt; i += lowbit(i))
{
bintree[i]++;
}
}
int sum(int x)
{
__int64 ans = 0;
for (int i = x; i; i -= lowbit(i))
{
ans += bintree[i];
}
return ans;
}
int binserach(int x)
{
int l = 1, r = cnt, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (xis[mid] > x)
{
r = mid - 1;
}
else if (xis[mid] < x)
{
l = mid + 1;
}
else
{
return mid;
}
}
}
int main()
{
int n;
while (~scanf("%d", &n))
{
memset (bintree, 0, sizeof(bintree));
cnt = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%d", &arr[i]);
xis[++cnt] = arr[i];
}
sort (xis + 1, xis + cnt + 1);
cnt = unique(xis + 1, xis + 1 + cnt) - xis - 1;
__int64 ans = 0;
for (int i = 1; i <= n; ++i)
{
int cur = binserach(arr[i]);
add(cur);
ans += i - sum(cur);
}
printf("%I64d\n", ans);
}
return 0;
}