POJ Ultra-QuickSort(2299)-用归并排序求min交换次数

来源:互联网 发布:windows启动不了怎么办 编辑:程序博客网 时间:2024/05/29 18:30

      题意:有一串序列,(数字各不相同),每次只能够交换相邻的两个数字,问将其排为升序所需的交换次数。

没什么想法,COPY的网上题解。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>`#include <algorithm>#include <cctype>#include <set>#include <vector>#define INF 0x7fffffff#define eps (1e-9)#define clearto(s,x) memset(s,x,sizeof(s))using namespace std;int n,m,tot=0;int a[500009],tt[500009];long long mergesort(int l,int r){    if(l==r)  return 0;    int mid=(l+r)>>1;    long long cnt=0;    cnt=mergesort(l,mid)+mergesort(mid+1,r);    int i=l,t=mid+1,k=l;    while(i<=mid&&t<=r){       if(a[i]<=a[t])           tt[k++]=a[i++];         else{    cnt+=(mid-i+1); tt[k++]=a[t++]; }    }    while(i<=mid) tt[k++] =a[i++];    while(t<=r)   tt[k++] =a[t++];    for(i=l;i<=r;i++)      a[i]=tt[i];        return cnt;}int main(){    //freopen("D:\data.txt","r",stdin);    int TT,i,k,t;    while(scanf("%d",&n)&&n)    {        for(i=0;i< n;i++)   scanf("%d",&a[i]);        long long  ans =mergesort(0,n-1);        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击