Skip to content

11542: 【原1542】逆序对

题目

题目描述

author: 金耀楠 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1542

Description

Given n numbers, output the number of reverse pair. The reverse pair is such number pair (a,b): the position of a is smaller than b and the value of a is bigger than b.

For example, Given an array of number 9 5 1 6 2 7 3 8, there are 13 reverse pairs:

(9,5), (9,1), (9,6), (9,2), (9,7), (9,3), (9,8), (5,1), (5,2), (5,3), (6,2), (6,3), (7,3)

(This is the problem C for SEIEE-Yu Yong Data Structure 2015 Fall Exam 2)

Input Format

Two rows, the first row is a number n.

The second rows is n numbers separated by a blank.

Output Format

One number, the answer.

*hint: The answer is probably bigger than 2^31.

Sample Input

8
9 5 1 6 2 7 3 8

Sample Output

13

Data Range

40%0 : n < 1000

100% : n < 300 000

yyong119's solution

#include <cstdio>

using namespace std;

const int MAXN = 300000;
int a[MAXN + 10];
long num;

void mergearr(int l, int r) {

    int mid = (l + r) >> 1, i = l, j = mid + 1, k = l;
    int temp[MAXN + 10];
    while ((i <= mid)&&(j <= r)) {
        if (a[i] > a[j]) {
            temp[k++] = a[j++];
            num += mid - i + 1;
        } else {
            temp[k++] = a[i++];
        }
    }
    while (i <= mid) temp[k++] = a[i++];
    while (j <= r) temp[k++] = a[j++];
    for (int i = l; i <= r; i++) a[i] = temp[i];
}

void merge_sort(int l, int r) {

    if (l < r) {
        int mid = (l + r) >> 1;
        merge_sort(l, mid);
        merge_sort(mid + 1, r);
        mergearr(l, r);
    }
}

int main() {

    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    merge_sort(1, n);
    printf("%ld\n", num);
}