题目链接: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;
}
本文介绍了一种利用归并排序解决POJ 2299题目的方法,该题旨在计算给定数组中的逆序数对数量。通过递归分解数组,并在合并过程中计算逆序数对,实现了高效求解。
696

被折叠的 条评论
为什么被折叠?



