Инверсии через 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;
}