AcWing 788:逆序对的数量 ← 树状数组 + 离散化(数组 + sort + STL map)

【题目来源】
https://www.acwing.com/problem/content/790/

【题目描述】
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。

【输入格式】
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。

【输出格式】
输出一个整数,表示逆序对的个数。

【输入样例】
6
2 3 4 5 6 1

【输出样例】
5

【数据范围】
1≤n≤100000,
数列中的元素的取值范围 [1,10^9]。

【算法分析】
● 本题数据个数为 1e5,但数据范围至 1e9,比较稀疏,故需进行离散化。

● 传统的逆序对统计需要两两比较数值大小,需要检查 C(n,2)=n(n-1)/2 对组合,时间复杂度为 O(n²)。而“树状数组+离散化”方法,不直接比较“数值”,而是通过树状数组去查询“位置”的统计信息。通过巧妙的数据结构转换,将问题降维为高效的前缀和查询,时间复杂度为 O(logn) 。

● 逆序对问题可以用“树状数组+离散化”实现,其核心原理是‌“通过离散化建立数值到位置的映射,再利用树状数组高效维护和查询这些位置上的计数信息,从而避免了直接的数值两两比较”。
(1)树状数组的作用‌:树状数组的每个位置代表离散化后的一个值(一个“桶”),记录每个数值出现的次数。通过查询前缀和,可以快速知道小于等于某个值的数有多少个。
(2)离散化的必要性‌:原始数据的数值范围很大,但实际不同的数值个数有限。离散化将大范围的数值映射到连续的整数下标,减少空间占用。

● 树状数组的概念、结构及实现:https://blog.csdn.net/hnjzsyjyj/article/details/149672973

● STL map 简介​:https://blog.csdn.net/hnjzsyjyj/article/details/146118701

【算法代码:数组 + sort + STL map

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int maxn=1e6+5;
int a[maxn],c[maxn],t[maxn];
map<int,int> mp;
int n,cnt=1;

int lowbit(int i) {
    return (-i)&i;
}

void pointUpdate(int i,int val) {
    while(i<=n) {
        c[i]+=val;
        i+=lowbit(i);
    }
}

LL preSum(int i) {
    LL s=0;
    while(i>0) {
        s+=c[i];
        i-=lowbit(i);
    }
    return s;
}

int main() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        t[i]=a[i];
    }
    sort(t+1,t+n+1);

    for(int i=1; i<=n; i++) { //discretization
        if(mp.find(t[i])==mp.end()) {
            mp[t[i]]=cnt++;
        }
    }

    LL ans=0;
    for(int i=n; i>=1; i--) {
        ans+=preSum(mp[a[i]]-1);
        pointUpdate(mp[a[i]],1);
    }
    cout<<ans<<endl;

    return 0;
}

/*
in:
10
88 71 16 2 72 38 94 50 72 67

out:
21
*/




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/149672973
https://blog.csdn.net/hnjzsyjyj/article/details/149002577
https://blog.csdn.net/hnjzsyjyj/article/details/148860296
https://blog.csdn.net/hnjzsyjyj/article/details/146118701








posted @ 2025-11-25 14:53  Triwa  阅读(7)  评论(0)    收藏  举报