NOIP 提高组初赛 · NOIP 2017 提高组初赛试题 第 25 题

选择题 · 答案 8 · 考点:输入输出、位运算、分支结构、循环结构、一维数组、STL算法基础

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#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

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构一维数组STL算法基础

解题思维

看到归并排序合并循环 → 先想 s += mid - i + 1 统计的是左半剩余逆序对

常见错误

只加 1 忽略左半剩余;递归出口误操作;下标范围搞错;逆序对定义记混

详细解析(节选)

考点:归并排序|逆序对统计

程序在做什么

程序实现归并排序,在合并左右两段有序序列时,若右段元素小于左段当前元素,则左段剩余所有元素均与其构成逆序对,累加 mid - i + 1。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断