就是求逆序对,可以用树状数组或者线段树做,这里是是用分治法,练练手。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int s[500005], t[500005], sum;
void meger(int a, int mid, int b)
{
int i = a;
int j = mid + 1;
int k = a;
while(i <= mid && j <= b)
{
if(s[i] > s[j])
{
t[k++] = s[j++];
sum += mid - i + 1;
}
else
t[k++] = s[i++];
}
while(i <= mid) t[k++] = s[i++];
while(j <= b) t[k++] = s[j++];
for(int u = a; u <= b; ++ u)
s[u] = t[u];
}
void megger(int a, int b)
{
int mid;
if(a < b)
{
mid = (a + b) >> 1;
megger(a, mid);
megger(mid + 1, b);
meger(a, mid, b);
}
}
int main()
{
int n;
while(scanf("%d", &n) && n)
{
sum = 0;
for(int i = 1; i <= n; ++ i)
scanf("%d", &s[i]);
megger(1, n);
printf("%lld\n", sum);
}
return 0;
}