当前位置: 代码迷 >> 综合 >> hud 3743 frosh week (归并排序)(逆序对)
  详细解决方案

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

热度:19   发布时间:2024-01-09 02:44:01.0

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;
}

 

  相关解决方案