找了半天都没找到哪里错了,我太菜了
  • 板块P1908 逆序对
  • 楼主Man_CCNU
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/5/26 09:50
  • 上次更新2023/10/28 00:36:55
查看原帖
找了半天都没找到哪里错了,我太菜了
524191
Man_CCNU楼主2022/5/26 09:50
#include<iostream>

using namespace std;

const int N = 5e6 + 10;
int a[N], n;
long long int res;

void mergesort(int l, int r)
{
    if (r <= l) return;
    int mid = (l + r) / 2;
    mergesort(l, mid);
    mergesort(mid + 1, r);
    int tem[N], tem2[N];

    for (int i = 1; i <= mid - l + 1; i++) {
        tem[i] = a[i + l - 1];
    }
    for (int i = 1; i <= r - mid; i++) {
        tem2[i] = a[i + mid];
    }

    int ptr1 = 1, ptr2 = 1, cur = l;
    while (ptr1 <= mid - l + 1 && ptr2 <= r - mid) {
        if (tem[ptr1] <= tem2[ptr2]) {
            a[cur++] = tem[ptr1++];
        }
        else {
            a[cur++] = tem2[ptr2++];
            res = res + mid - ptr1 + 1;
        }
    }
    while (ptr1 <= mid - l + 1) {
        a[cur++] = tem[ptr1++];
    }
    while (ptr2 <= r - mid) {
        a[cur++] = tem2[ptr2++];
    }

    return;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    mergesort(1, n);
    cout << res << endl;

    return 0;
}
2022/5/26 09:50
加载中...