zoukankan      html  css  js  c++  java
  • Ultra-QuickSort--POJ2299(归并排序求逆序数对)

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

    归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上

    述方法逐步缩小序列,先使子序列有序,再使子序列区间有序,然后再把有序区间合并,很好滴体现了分治的思想。

    逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与a[j]为逆序数对)

    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    #include<iostream>
    
    using namespace std;
    #define N 500050
    #define memset(a,b) memset(a,b,sizeof(a))
    
    long long  cont;
    
    int a[N],b[N];
    
    void merge(int l,int r)
    {
        if(l>=r)
            return;
        int mid=(l+r)/2;
        merge(l,mid);
        merge(mid+1,r);
        int x=l;
        int y=mid+1,i=l;
        while(x<=mid || y<=r)
        {
            if(y>r || (x<=mid && a[x]<a[y]))
                b[i++]=a[x++];
            else
            {
                if(x<=mid)
                    cont+=mid-x+1;
                b[i++]=a[y++];
            }
        }
        for(i=l;i<=r;i++)
            a[i]=b[i];
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n),n)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
            }
            cont=0;
            merge(0,n-1);///归并排序
            printf("%lld
    ",cont);
        }
        return 0;
    }
  • 相关阅读:
    排球运动规则简介
    我与计算机
    我和电脑的不解之缘
    作业
    怎样成为一个高手 观后感
    本周作业
    作业个人
    本周作业
    本周总结
    本周总结(13周)
  • 原文地址:https://www.cnblogs.com/linliu/p/5473351.html
Copyright © 2011-2022 走看看