• 逆序数


    51Nod

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
     
    如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>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #define N 52005
    using namespace std;
    int a[N],c[N],d[N];
    
    int Lowbit(int t)
    {   ///设k为t末尾0的个数,则求得为2^k=t&(t^(t-1));
        return t&(t^(t-1));
    }
    void update(int x)
    {
        while(x > 0)
        {
            c[x]+=1;
            x -= Lowbit(x);
        }
    }
    int sum(int li)
    {
        int sum=0;
        while(li<=N)
        {
            sum+=c[li];
            li=li+Lowbit(li);
        }
        return sum;
    }
    
    map<int ,int>q;
    int main()
    {
        int n,x;
        int Sum;
        while(scanf("%d",&n)!=EOF)
        {
            Sum=0;
            memset(c,0,sizeof(c));
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                d[i]=a[i];
            }
    
            sort(a,a+n);
            int pre=1,tot=1;
            for(int i=0;i<n;i++)
            {
                if(a[i]==pre)
                {
                    a[i]=tot;
                    q[pre]=tot;
                }
                else
                {
                    pre=a[i];
                    a[i]=++tot;
                    q[pre]=tot;
                }
            }
    
            for(int i=0;i<n;i++)
            {
                d[i]=q[d[i]];
            }
    //        for(int i=0;i<n;i++)
    //            cout<<d[i]<<" ";
            for(int i=0;i<n;i++)
            {
                Sum+=sum(d[i]+1);
                update(d[i]);
            }
            printf("%d
    ",Sum);
        }
        return 0;
    }
  • 相关阅读:
    mysql数据库
    is not in the sudoers file.This incident will be reported
    linux的一些命令
    u盘安装linux(windows7+linux双系统)
    优惠券、礼品卡、礼券
    优惠营销管理
    优惠营销管理
    hdu 1166 线段树单点更新
    hdu 1542 扫描线求矩形面积的并
    hdu 2444 二分图判断与最大匹配
  • 原文地址:https://www.cnblogs.com/chen9510/p/5466970.html
Copyright © 2020-2023  润新知