• 求逆序对


    给出若干个数,每次可以交换相邻的两个,如果要将这些数变成非递减的数,需要操作多少次?
    很容易就可以想到暴力的解决方式
    如果是数据范围比较小的时候,可以直接进行暴力求解
    如果是数据范围比较大的时候,这时候需要用树状数组求解一下
    附上暴力的代码

    	int n;
    	cin >> n;
    	for(int i=1;i<=n;i++) a[i] = read;
            int cnt = 0;
            for(int i=1;i<=n;i++){
                for(int j=i+1;j<=n;j++){
                    if(a[i] > a[j]){
                        cnt ++;
                    }
                }
            }
            printf("%d
    ",cnt);
    

    树状数组:

    int a[999999];
    int n;
    int ret;
    int _Low(int x){
        return x & (-x);
    }
    void _Add(int pos,int x){
        while(pos <= limit){///limit 据实际情况来判断
            a[pos] += x;
            pos += _Low(pos);
        }
    }
    int _Getsum(int i){
        int ans = 0;
        while(i){
            ans += a[i];
            i -= _Low(i);
        }
        return ans;
    }
    int main()
    {
        while(cin >> n)
        {
            ret = 0;
            for(int i=1;i<=n;i++) a[i] = 0;
            for(int i=1;i<=n;i++){
                int x = read;
                _Add(x,1);
                ret += i - _Getsum(x);
            }
            printf("%d
    ",ret);
        }
        return 0;
    }
    
  • 相关阅读:
    线性dp 打鼹鼠
    区间dp 能量项链 洛谷p1063
    洛谷 CF1012C Hills (动态规划)
    交作业了 动态规划 木棍加工
    最短路之Floyd
    最小生成树
    寒假集训并查集初级版
    【倍增DP】——保卫王国
    bootstrap四部分概述
    zrender初识
  • 原文地址:https://www.cnblogs.com/PushyTao/p/14507418.html
Copyright © 2020-2023  润新知