poj——2299(归并排序求逆序数对)

来源:互联网 发布:python手册中文版 pdf 编辑:程序博客网 时间:2024/05/29 17:40

题目地址:http://poj.org/problem?id=2299

参考地址:http://blog.csdn.net/lyy289065406/article/details/6647346

#include <iostream>#include <cmath>#include <string>#include <cstring>#include <cstdlib>#include <ctime>#include <algorithm>#include <cstdio>using namespace std;typedef long long ll;#define INF 1000000000#define MAX(a,b) a>b?a:b#define MIN(a,b) a>b?b:a#define N 500005 ll ans;void solve(int a[],int st,int mid,int end){       int len_L=mid-st+1;int len_R=end-mid;int* left=new int[len_L+2];int* right=new int[len_R+2];int i,j;for(i=1;i<=len_L;i++)left[i]=a[st+i-1];left[len_L+1]=INF;   //设置无穷上界,避免比较大小时越界for(j=1;j<=len_R;j++)right[j]=a[mid+j];right[len_R+1]=INF;   //设置无穷上界,避免比较大小时越界i=j=1;for(int k=st;k<=end;)if(left[i]<=right[j])a[k++]=left[i++];else{a[k++]=right[j++];ans+=len_L-i+1;    //计算逆序数}delete left;delete right;return;}void mergesort(int a[],int st,int end){if(st<end){int mid=(st+end)/2;mergesort(a,st,mid);mergesort(a,mid+1,end);solve(a,st,mid,end);}    return ;}int main(){int n;  int a[N];while(scanf("%d",&n)!=-1&&n){ans=0;for(int i=1;i<=n;i++)cin>>a[i]; mergesort(a,1,n);printf("%I64d\n",ans);}return 0;}