正在载入在线练习界面,本页内容可直接阅读…
AK CSP › NOIP 提高 2017 第一轮真题 › 第 25 题
NOIP 提高 2017 第一轮 第 25 题:归并排序统计逆序对
题目
```
#include <iostream>
using namespace std;
int n, s, a[100005], t[100005], i;
void mergesort(int l, int r)
{
if (l == r)
return;
int mid = (l + r) / 2;
int p = l;
int i = l;
int j = mid + 1;
mergesort(l, mid);
mergesort(mid + 1, r);
while (i <= mid && j <= r)
{
if (a[j] < a[i])
{
s += mid - i + 1;
t[p] = a[j];
p++;
j++;
}
else
{
t[p] = a[i];
p++;
i++;
}
}
while (i <= mid)
{
t[p] = a[i];
p++;
i++;
}
while (j <= r)
{
t[p] = a[j];
p++;
j++;
}
for (i = l; i <= r; i++)
a[i] = t[i];
}
int main()
{
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i];
mergesort(1, n);
cout << s << endl;
return 0;
}
```
输入:6
2 6 3 4 5 1
输出:_________本小题
请写出程序的输出结果。
答案
8
题解
考点定位
本题考「归并排序逆序对」,对应大纲 4.3.2 归并(难度【4】)。
解题过程
mergesort 中 a[j]<a[i] 时 s += mid−i+1(统计逆序对)。输入 2,6,3,4,5,1:逆序对 (6,3),(6,4),(6,5),(6,1),(3,1)? 逐对:(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1) → 8 个。
答案:8。
易错提醒
① 归并时右半元素先出 ⇒ 它比左半剩余的都小 ⇒ s+=mid−i+1;② 逆序对数验证:暴力 O(n²) 数一遍对照。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号