求逆序数

nyist 129

题目大意:

解决:归并排序




#include <iostream> 

#include <cstdio>

using namespace std;



int num[1000005];

int tmp[1000005];

long long  total;

void merge(int beg,int mid,int end)

{

    int i=beg,j=mid+1,k=0;

    while(i<=mid && j<=end)

    {//最关键的是下边这句话total+= mid-i+1;意思是前边比后边这个数大的个数

        if(num[i]>num[j]){tmp[k++]=num[j++];total+= mid-i+1;}

        else tmp[k++]=num[i++];

    }

    while(i<=mid)tmp[k++]=num[i++];

    while(j<=end)tmp[k++]=num[j++];

    for(i=0,j=beg;i<k;i++)num[j++]=tmp[i];

}

void solve(int beg,int end)

{   

    if(beg<end)

    {

        int mid=(beg+end)/2;

        solve(beg,mid);

        solve(mid+1,end);

        merge(beg,mid,end);

    }

}



int main()

{

    int icase;

    scanf("%d",&icase);

    while(icase--)

    {

        int n;

        total=0;

        scanf("%d",&n);

        for(int i=1;i<=n;i++)scanf("%d",&num[i]);

        solve(1,n);

        printf("%lld\n",total);

    }

    system("pause");

    return 0;

}

你可能感兴趣的:(求逆序数)