http://www.luogu.org/problem/show?pid=1908
归并排序求解即可,经典问题
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ms(i,j) memset(i,j, sizeof i);
using namespace std;
int A[40005];
int T[40005];
int cnt = 0;
int merges(int x, int y)
{
if (y-x>1)
{
int mid = (x+y)/2;
merges(x, mid);
merges(mid, y);
int p = x, q = mid, i = x;
while (p < mid || q < y)
{
if (q >= y || (p < mid && A[p]<=A[q])) T[i++] = A[p++];
else {T[i++] = A[q++];cnt += mid-p;}
}
for (int i=x;i<y;i++) {A[i] = T[i];}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++) scanf("%d", &A[i]);
merges(1,n+1);
printf("%d\n", cnt);
return 0;
}