poj1804

#include <iostream>
#include <stdio.h>

using namespace std;

long long sum;

void add(int a[],int l,int m,int r) //歸併
{
    int i,j,k,b[r-l+2];
    i=l;j=m+1;
    for (k=1;i<=m&&j<=r;k++)
    {
        if (a[i]<=a[j])
        {
            b[k]=a[i];
            i++;

        }
        else
             {
                b[k]=a[j];
                j++;
                sum+=m-i+1;
             }
    }
    while (i<=m) b[k++]=a[i++];
    while (j<=r) b[k++]=a[j++];
    i=1;
    for (k=l;k<=r;k++) a[k]=b[i++];
}

void sortt(int a[],int l,int r) //遞歸排序
{
    int m;
    if (l<r)
    {
        m=(l+r)/2;
        sortt(a,l,m);
        sortt(a,m+1,r);
        add(a,l,m,r);
    }
}


int main()
{   int m,n,i,j,a[1100];
   // freopen("in.txt","r",stdin);
    cin>>m;
    for (i=1;i<=m;i++)
    {
        cin>>n;
        for (j=1;j<=n;j++) cin>>a[j];
        sum=0;
        sortt(a,1,n);
        cout<<"Scenario #"<<i<<":"<<endl<<sum<<endl<<endl;
    }
    return 0;
}

歸併排序求數列的逆序數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章