题目链接:http://poj.org/problem?id=2299
题目意思很简单,其实冒泡就能搞定结果,但是肯定会超时
题目其实就是要你求逆序数对数,归并排序搞一下就可以了!
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 510000
#define LL long long
int rec[maxn],temp[maxn],n;
LL ans;
int merge(int *a,int *b,int len1,int len2){
int i=0,j=0,k=0;
while(i<len1 && j<len2){
if(a[i]>b[j]){
ans+=len1-i;//前面的a[i]后面的都会比后面的b[j大
temp[k++]=b[j++];
}
else temp[k++]=a[i++];
}
while(i<len1) temp[k++]=a[i++];
while(j<len2) temp[k++]=b[j++];
memcpy(a,temp,k*4);
return 0;
}
int merge_sort(int l,int r){
if(l>=r) return 0;
int mid=(l+r)>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
merge(rec+l,rec+mid+1,mid-l+1,r-mid);
return 0;
}
int main(){
int i,j,k;
while(scanf("%d",&n),n){
for(i=0;i<n;i++)
scanf("%d",&rec[i]);
ans=0;
merge_sort(0,n-1);
printf("%lld\n",ans);
}
return 0;
}