Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- using ll = long long;
- // Функция подсчёта количества инверсий в векторе a
- ll countInversions(vector<int> a) {
- if (a.size() < 2)
- return 0; // Если элементов меньше двух, инверсий нет
- // Выбор опорного элемента (средний элемент)
- int pivot = a[a.size() / 2];
- // Подсчёт «перекрёстных» инверсий
- ll inv = 0; // Общее число перекрёстных инверсий
- ll countGreater = 0; // Количество элементов > pivot, встретившихся ранее
- for (int x : a) {
- if (x > pivot) {
- ++countGreater; // Увеличиваем счётчик больших элементов
- } else if (x < pivot) {
- inv += countGreater; // Каждое такое x даёт countGreater инверсий
- }
- }
- // Разбиение на две части: < pivot и > pivot
- vector<int> left, right;
- left.reserve(a.size());
- right.reserve(a.size());
- for (int x : a) {
- if (x < pivot)
- left.push_back(x); // Элементы меньше pivot в left
- else if (x > pivot)
- right.push_back(x); // Элементы больше pivot в right
- // Элементы, равные pivot, пропускаем
- }
- // Рекурсивный подсчёт инверсий в подмассивах
- return inv
- + countInversions(left) // Инверсии в левой части
- + countInversions(right); // Инверсии в правой части
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- vector<int> a;
- int x;
- while (cin >> x) {
- a.push_back(x);
- }
- cout << countInversions(a) << "\n";
- return 0;
- }
Add Comment
Please, Sign In to add comment