Инверсии через Merge на C++

Всем привет! Я бы хотел реализовать подсчёт инверсий в массиве через сортировку слиянием, но что-то не работает... Под инверсией понимается a[i] > a[j] при i < j. Подскажите, пожалуйста, в чём ошибка? (Она точно есть, но конкретных тестов я привести не могу). На вход я подаю n - размер массива (скажем 1 <= n <= 100000) и массив (каждый элемент -10^9 <= a[i] <= 10^9). Если можете хотя бы скинуть тест, при котором это неправильно работает, то кидайте, буду рад)

P.S. Вопрос решён. Ответ на него такой: переполнение. Это ещё один пример того как маленькая неточность приводит к огромной потере времени. Так что будьте внимательны!

P.P.S Строчку int inversion_counter = 0; заменяем на long long inversion_counter = 0; и ошибок нет.

#include <fstream>
#include <vector>

using namespace std;

int inversion_counter = 0;

vector<int> mergeVectors(vector<int> left, vector<int> right) {
    vector<int> result = {};

    int len_left = left.size(), len_right = right.size();
    int idx_left = 0, idx_right = 0;

    while (idx_left < len_left && idx_right < len_right) {
        if (left[idx_left] <= right[idx_right]) {
            result.push_back(left[idx_left]);
            idx_left++;
        } else {
            result.push_back(right[idx_right]);

            // Подсчёт инверсий

            inversion_counter += len_left - idx_left;
            idx_right++;
        }
    }
    for (int i = idx_left; i < len_left; i++)
        result.push_back(left[i]);

    for (int i = idx_right; i < len_right; i++)
        result.push_back(right[i]);

    return result;
}

vector<int> sortVector(vector<int> initial_vec) {
    int len_initial = size(initial_vec);

    vector<int> left = {};
    vector<int> right = {};

    for (int i = 0; i < len_initial / 2; i++)
        left.push_back(initial_vec[i]);

    for (int i = len_initial / 2; i < len_initial; i++)
        right.push_back(initial_vec[i]);

    if (left.size() > 1)
        left = sortVector(left);

    if (right.size() > 1)
        right = sortVector(right);

    return mergeVectors(left, right);
}


int main() {
    int n;
    vector<int> sorted_vec = {};

    ifstream in;
    in.open("inversions.in");

    in >> n;

    for (int i = 0; i < n; i++) {
        int current_value;
        in >> current_value;
        sorted_vec.push_back(current_value);
    }
    in.close();

    // Сортировка слиянием вектора sorted_vec:

    sortVector(sorted_vec);

    ofstream out;
    out.open("inversions.out");

    out << inversion_counter;

    out.close();
    return 0;
}

Ответы (0 шт):