• PAT-T1027 Larry and Inversions (树状数组)


    题意:

    每次翻转一段区间,询问翻转区间后整个序列的逆序对数量。

    题解:

    每次翻转区间,那么翻转区间的答案就是整个序列的原始答案减去这个区间里逆序对的数量加上顺序对的数量。

    统计逆序对和顺序对用树状数组做。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    int n;
    int a[maxn];
    int c[maxn];
    int lowbit(int x) {
        return x&-x;
    }
    void add (int x,int val) {
        for (int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
    }
    int getsum (int x) {
        int ans=0;
        for (int i=x;i;i-=lowbit(i)) ans+=c[i];
        return ans;
    }
    vector<int> ans;
    int main () {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",a+i);
        int wjm=0;
        for (int i=1;i<=n;i++) {
            wjm+=getsum(n)-getsum(a[i]);
            add(a[i],1);
        } 
        for (int i=1;i<=n;i++) {
            memset(c,0,sizeof(c));
            int sum=0;
            int sum_=0;//顺序对数量 
            for (int j=i;j<=n;j++) {
                sum+=getsum(n)-getsum(a[j]);
                sum_+=getsum(a[j]);
                //翻转一段区间,答案就是总的逆序对数量减去这个区间内的逆序对数量加上这个区间的顺序对数量 
                ans.push_back(wjm-sum+sum_);
                add(a[j],1);
            }
            // 
        }
        for (int i=0;i<ans.size();i++) {
            if (i) printf(" ");
            printf("%d",ans[i]);
        }
    }
  • 相关阅读:
    Python3之json文件操作
    Python3之MySQL操作
    使用requests模块的网络编程
    Python 判断小数的函数
    python之函数
    CPUID
    .inc
    probe,victim,
    coolcode
    Linux vim 常用方法
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13357042.html
Copyright © 2020-2023  润新知