• 算法基础题


    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。

    -----------------------------------------------------------------------------

    二分排序的思想,合并两个有序数列a,b时,如果序列b队首元素小则逆序数增加序列a的当前长度。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N = 50500;
    int A[2][N];
    int main(){
        long long ans = 0;
        int n;cin>>n;
        for(int i=0;i<n;i++) scanf("%d",A[0]+i);
    
        bool flag = false;
        int aid,bid,cid;
        for(int stride = 1;stride<n;stride<<=1){
            for(int i=0;i<n;i+=(stride<<1u)){
                bid = (cid = aid = i) + stride;
    
                int aed = std::min(bid,n);
                int bed = std::min(bid+stride,n);
    
                while(aid<aed&&bid<bed){
                    if(A[flag][aid]<=A[flag][bid]){
                        A[!flag][cid++] = A[flag][aid++];
                    }
                    else{
                        A[!flag][cid++] = A[flag][bid++];
                        ans+=aed-aid;
                    }
                }
                while(aid<aed) A[!flag][cid++] = A[flag][aid++];
                while(bid<bed) A[!flag][cid++] = A[flag][bid++];
            }
            flag = !flag;
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    Uva 11401 数三角形
    Uva 11538 象棋中的皇后
    数学基础——基本计数方法
    八数码问题
    python 爬poj.org的题目
    python 爬图片
    hiho 第135周 九宫
    Uva 11464 偶数矩阵
    BZOJ 1001 [BeiJing2006]狼抓兔子
    LA 3708 墓地雕塑
  • 原文地址:https://www.cnblogs.com/redips-l/p/7994006.html
Copyright © 2020-2023  润新知