hud 3743 frosh week (归并排序)(逆序对)

http://acm.hdu.edu.cn/showproblem.php?pid=3743

测试模板的一道题,蛮好的。

敲了两种板子,白书上的第一种板子有点问题,改了一下,还是不太理解。

第二种网上的好理解。

#include <iostream>
#include<stdio.h>
#include<cstring>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;

long long cnt=0;
//void merge_sort(int* A,int x,int y,int* T) 
//{
//    if(y-x>1) //!包括x,不包括y
//    {
//        int m=x+((y-x)>>1);
//        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
//            {
//                T[i++]=A[q++];
//                cnt+=abs(m-p);
//            }
//        }
//        for(int i=x;i<y;i++)
//            A[i]=T[i];
//    }
//    else if(A[x]>A[y])
//    {
//        swap(A[x],A[y]);
//        cnt++;
//    }
//}

void merge_sort(int* A,int x,int y,int* T)
{
    if(x==y) return;
    int mid=(x+y)>>1,i,j,k;
    i=x,k=x,j=mid+1;
    merge_sort(A,x,mid,T);
    merge_sort(A,mid+1,y,T);
    while(i<=mid&&j<=y)
    {
        if(A[i]<=A[j]) T[k++]=A[i++];
        else    cnt+=mid-i+1,T[k++]=A[j++];
    }
    while(i<=mid) T[k++]=A[i++];
    while(j<=y) T[k++]=A[j++];
    for(int i=x;i<=y;i++)
        A[i]=T[i];
}

int source[1000008],t[1000008];

int main()
{

    int num;
    while(scanf("%d",&num)!=EOF)
    {
        cnt=0;
        for(int i=0;i<num;i++)
        {
            scanf("%d",&source[i]);
        }
        merge_sort(source,0,num-1,t);
        printf("%I64d\n",cnt);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/sadsummerholiday/article/details/82019858
HUD