zoukankan      html  css  js  c++  java
  • 【Luogu1908】逆序对(树状数组求逆序对)

    problem

    • 给你一个长为n的序列A[]
    • 求该序列的逆序对个数

    solution

    • 用b[i]保存下标i在A中出现的次数,那么数组b[i]在[l,r]上的区间和,就表示序列A在范围[l,r]内的有多少个数
    • 我们把数组A按照数值大小先排序。
    • 我们在序列a的下标范围上建立一个树状数组,维护b的前缀和
    • 倒序扫描A,每次累加到前一个数为止(排序前的,以及a[i]前一个是a[i-1]),有多少个数比他大。(因为已排序,所有>A[i]的值都在之前加入b了,不会遗漏)

    codes

    #include<iostream>
    #include<algorithm>
    #define maxn 50000
    using namespace std;
    
    struct node{int val, num;}a[maxn];
    bool cmp(node a, node b){return a.val<b.val;}
    
    int n, b[maxn];
    void add(int x, int v){ for(int i = x; i <= n; i+=i&(-i))b[i]+=v;}
    int query(int x){ int ans=0;for(int i=x;i>0;i-=i&(-i))ans+=b[i];return ans;}
    
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++)
            cin>>a[i].val,a[i].num=i;
        sort(a+1,a+n+1,cmp);
        int ans = 0;
        for(int i = n; i >= 1; i--){
            add(a[i].num,1);
            ans += query(a[i].num-1);
        }
        cout<<ans<<'
    ';
        return 0;
    }
  • 相关阅读:
    Pandas数据分析 (三)
    Pandas数据分析 (二)
    Pandas数据分析 (一)
    Django后台应用管理名称修改
    Jupyter Notebooks 配置
    Hadoop完全分布式搭建流程
    Java学习笔记(五)
    微信小程序学习笔记(一)
    redis windows版安装
    Linux计划任务
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444765.html
Copyright © 2011-2022 走看看