2402. 逆序对

1000ms 256MB 简单 树状数组 线段树
题目描述
对于一个长度为 $n$ 的整数序列 $a$,如果存在一组下标 $(i,j)$ 满足: - $i < j$ - $a_i > a_j$ 那么称 $(i,j)$ 为该序列中的一个**逆序对**。 现在给定一个整数序列,请你统计其中逆序对的总数量。
输入格式
- 第一行输入一个整数 $n$,表示序列长度。 - 第二行输入 $n$ 个整数,表示序列中的元素。
输出格式
- 输出一个整数,表示序列中的逆序对数量。
样例 1
输入 (Input)

                    
输出 (Output)

                    
样例说明
序列: ``` 5 4 2 6 3 1 ``` 其中逆序对包括: ``` (5,4) (5,2) (5,3) (5,1) (4,2) (4,3) (4,1) (2,1) (6,3) (6,1) (3,1) ``` 共计 $11$ 个。
- 对于 $25\%$ 的数据:$n \le 2500$ - 对于 $50\%$ 的数据:$n \le 4 \times 10^4$ - 对于 $100\%$ 的数据: - $1 \le n \le 5 \times 10^5$ - $0 \le a_i \le 10^9$ 由于数据规模较大,不能使用 $O(n^2)$ 的双重循环暴力统计。 本题推荐使用: - **归并排序统计逆序对** - 或 **树状数组 + 离散化** 其中归并排序做法的核心思想为: 1. 将数组递归划分为左右两部分。 2. 左右部分分别统计逆序对数量。 3. 在归并两个有序区间时: - 若左侧元素大于右侧元素, - 则左侧当前元素及其后面的所有元素都与右侧元素形成逆序对。 4. 在归并过程中即可完成统计。 整体时间复杂度为: $$ O(n \log n) $$
自测终端 stdin → stdout
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
训练中心
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字