1. 程式人生 > >YTU OJ 3305: 逆序數

YTU OJ 3305: 逆序數

3305: 逆序數

題目描述

在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出一個整數序列,求該序列的逆序數。

輸入

第1行:N,N為序列的長度(n <= 50000) 第2行:序列中的元素(0 <= A[i] <= 10^9)

輸出

輸出逆序數

樣例輸入

4
2 4 3 1

樣例輸出

4
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long int a[50001],b[50001],temp[50001];
int cnt=0;
void Merge(int left,int mid,int right)
{
    int i=left,j=mid+1,k=left;
    while(i<=mid&&j<=right)
    {
        if(a[i]>a[j])
        {
            temp[k++]=a[j++];
            cnt=cnt+mid-i+1;
        }
        else
        {
            temp[k++]=a[i++];
        }
    }
    while(i<=mid)
    {
        temp[k++]=a[i++];
    }
    while(j<=right)
    {
        temp[k++]=a[j++];
    }
    for(i=left;i<=right;i++)
    {
        a[i]=temp[i];
    }
}
void mergesort(int left,int right)
{
    if(left<right)
    {
        int mid=(left+right)/2;
        mergesort(left,mid);
        mergesort(mid+1,right);
        Merge(left,mid,right);
    }
}
int main()
{
    int n,m,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    mergesort(1,n);
    cout<<cnt<<endl;
    /*for(i=1;i<=n;i++)
    {
        cout<<a[i]<<' ';
    }*/
    return 0;
}