POJ 2299 Ultra-QuickSort(归并排序求逆序数)

来源:互联网 发布:微信聊天数据怎么恢复 编辑:程序博客网 时间:2024/05/16 17:46

题目链接: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 longint 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;}


原创粉丝点击