1019 逆序数

来源:互联网 发布:c语言顺序表的初始化 编辑:程序博客网 时间:2024/06/18 06:56

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
Input
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
输出逆序数
Input示例
4
2
4
3
1
Output示例
4

#include<iostream>using namespace std;int num[50005];int temp[50005];int ans=0;void mersort(int l,int r){    int i,j,k,m;    m=(l+r)/2;    i=l;    j=m+1;    k=l;    while(i<=m&&j<=r)    {        if (num[i]>num[j])        {            temp[k++]=num[j++];            ans+=m-i+1;        }        else        {            temp[k++]=num[i++];        }    }    while(i<=m)        temp[k++]=num[i++];    while(j<=r)        temp[k++]=num[j++];    for(int i=l;i<=r;i++)        num[i]=temp[i];}void mer(int l,int r){    int m=(l+r)/2;    if (l<r)    {        mer(l,m);        mer(m+1,r);        mersort(l,r);    }}int main(){    int n;    cin>>n;    for(int i=1;i<=n;i++)        cin>>num[i];    mer(1,n);    cout<<ans;    return 0;}
原创粉丝点击