参考资料 :
http://blog.youkuaiyun.com/morewindows/article/details/6678165
http://www.slyar.com/blog/poj-2299-c.html
模板:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn = 5e5+4;
int n, a[maxn], t[maxn];
__int64 sum;
//归并,
//合并子序列;
void Merge(int l, int mid, int r)
{
int p = 0;//p指向输出的区间
int i = l, j = mid+1;//i, j指向两个输入的区间,
while(i <= mid && j <= r)//两个区间不为空时
{
if(a[i] > a[j])
{
t[p++] = a[j++];
sum += mid-i+1;// a[i] 和 a[i]后面的数字都大于a[j];
}
else t[p++] = a[i++];
}
while(i <= mid) t[p++] = a[i++];//将非空的输入区间转移至输出区间
while(j <= mid) t[p++] = a[j++];//归并完成后将结果复制到原数组;
for(int k = 0; k < p; k++) a[l+k] = t[k];
}
//递归分解数列;
void MergeSort(int l, int r)
{
if(l < r)
{
int mid = (l+r)>>1;//将数列分为两个长度为n/2的数列
MergeSort(l, mid);//对两个子序列继续分,
MergeSort(mid+1, r);//知道子序列中的数据为1个;
Merge(l, mid, r);//合并,
}
}
int main()
{
while(scanf("%d", &n) != EOF && n)
{
sum = 0;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
MergeSort(0, n-1);
printf("%I64d\n", sum);
}
return 0;
}