Skip to content
On this page

ex01m2.cpp

cpp
#include <iostream>
#include <vector>

void merge(std::vector<int>& src, std::vector<int>& dst, int aBegin, int aEnd,
           int bBegin, int bEnd, int& cum) {
    int i = aBegin;
    int j = bBegin;

    int q = aBegin;

    while (true) {
        if (i >= aEnd && j >= bEnd) {
            break;
        }

        if (j >= bEnd) {
            dst[q++] = src[i++];
            continue;
        }

        if (i >= aEnd) {
            dst[q++] = src[j++];
            continue;
        }

        if (src[i] <= src[j]) {
            dst[q++] = src[i++];
            continue;
        } else {
            dst[q++] = src[j++];
            cum += aEnd - i;
            continue;
        }
    }

    for (int i = aBegin; i < bEnd; i++) {
        src[i] = dst[i];
    }
}

void divide(std::vector<int>& src, std::vector<int>& dst, int begin, int end,
            int& cum) {
    int mid = (begin + end) / 2;

    if (begin + 1 < end) {
        divide(src, dst, begin, mid, cum);
        divide(src, dst, mid, end, cum);
        merge(src, dst, begin, mid, mid, end, cum);
    }
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    std::vector<int> ori(N);
    std::vector<int> res(N);

    for (int i = 0; i < N; i++) {
        std::cin >> ori[i];
    }

    int cum = 0;
    divide(ori, res, 0, N, cum);

    std::cout << cum << "\n";
}

See on GitHub

Last Updated: 25/1/2567 12:48:26 (UTC+7)

Released under the MIT License