coloriot

HA51

Apr 20th, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. using ll = long long;
  5.  
  6. // Функция подсчёта количества инверсий в векторе a
  7. ll countInversions(vector<int> a) {
  8.     if (a.size() < 2)
  9.         return 0; // Если элементов меньше двух, инверсий нет
  10.  
  11.     // Выбор опорного элемента (средний элемент)
  12.     int pivot = a[a.size() / 2];
  13.  
  14.     // Подсчёт «перекрёстных» инверсий
  15.     ll inv = 0;          // Общее число перекрёстных инверсий
  16.     ll countGreater = 0; // Количество элементов > pivot, встретившихся ранее
  17.     for (int x : a) {
  18.         if (x > pivot) {
  19.             ++countGreater;             // Увеличиваем счётчик больших элементов
  20.         } else if (x < pivot) {
  21.             inv += countGreater;       // Каждое такое x даёт countGreater инверсий
  22.         }
  23.     }
  24.  
  25.     // Разбиение на две части: < pivot и > pivot
  26.     vector<int> left, right;
  27.     left.reserve(a.size());
  28.     right.reserve(a.size());
  29.     for (int x : a) {
  30.         if (x < pivot)
  31.             left.push_back(x);         // Элементы меньше pivot в left
  32.         else if (x > pivot)
  33.             right.push_back(x);        // Элементы больше pivot в right
  34.         // Элементы, равные pivot, пропускаем
  35.     }
  36.  
  37.     // Рекурсивный подсчёт инверсий в подмассивах
  38.     return inv
  39.          + countInversions(left)      // Инверсии в левой части
  40.          + countInversions(right);    // Инверсии в правой части
  41. }
  42.  
  43. int main() {
  44.     ios::sync_with_stdio(false);
  45.     cin.tie(nullptr);
  46.  
  47.     vector<int> a;
  48.     int x;
  49.  
  50.     while (cin >> x) {
  51.         a.push_back(x);
  52.     }
  53.  
  54.     cout << countInversions(a) << "\n";
  55.     return 0;
  56. }
  57.  
Add Comment
Please, Sign In to add comment