码迷,mamicode.com
首页 > 编程语言 > 详细

集训第四周(高效算法设计)A题 Ultra-QuickSort

时间:2015-08-05 12:36:56      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

原题poj 2299:http://poj.org/problem?id=2299

 

题意,给你一个数组,去统计它们的逆序数,由于题目中说道数组最长可达五十万,那么O(n^2)的排序算法就不要再想了,接下来的选择是快排,归并,看你喜欢了

 

这里列出归并的解法:

#include"iostream"
using namespace std;

const int maxn=500000+10;

int T[maxn];
int a[maxn];

long long sum;

void merge_sort(int *a,int x,int y,int *T)
{
    if(y-x>1)
    {
        int m=x+(y-x)/2;
        int p=x,q=m,i=x;
        merge_sort(a,x,m,T);
        merge_sort(a,m,y,T);
        while(p<m||q<y)
        {
            if(q>=y||(p<m&&a[p]<a[q])) T[i++]=a[p++];
            else {sum+=m-p;T[i++]=a[q++];}
        }
        for(int i=x;i<y;i++) a[i]=T[i];
    }
}
int main()
{
    int n;
    while(cin>>n&&n)
    {
        sum=0;
        for(int i=0;i<n;i++) cin>>a[i];
        merge_sort(a,0,n,T);
     /*   for(int i=0;i<n;i++) cout<<a[i]<<‘ ‘;
        cout<<endl;*/
        cout<<sum<<endl;
    }
    return 0;
}

集训第四周(高效算法设计)A题 Ultra-QuickSort

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/4704168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!