ProgMe

Inversions

Oct 21st, 2023
733
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int calculateAnswer(vector<int> &p, int l, int r) {
  6.     if (l == r) {
  7.         return 0;
  8.     }
  9.     int m = (l + r) / 2;
  10.     int answer = calculateAnswer(p, l, m) + calculateAnswer(p, m + 1, r);
  11.  
  12.     int i = l, j = m;
  13.     for (; i <= m; i++) {
  14.         while (j + 1 <= r && p[i] > p[j + 1]) {
  15.             j++;
  16.         }
  17.         answer += j - m;
  18.     }
  19.  
  20.     vector<int> v;
  21.     i = l, j = m + 1;
  22.     while (i <= m && j <= r) {
  23.         if (p[i] < p[j]) {
  24.             v.push_back(p[i++]);
  25.         } else {
  26.             v.push_back(p[j++]);
  27.         }
  28.     }
  29.     while (i <= m) {
  30.         v.push_back(p[i++]);
  31.     }
  32.     while (j <= r) {
  33.         v.push_back(p[j++]);
  34.     }
  35.     for (i = l; i <= r; i++) {
  36.         p[i] = v[i - l];
  37.     }
  38.  
  39.     return answer;
  40. }
  41.  
  42. int main() {
  43.     int n;
  44.     cin >> n;
  45.  
  46.     vector<int> p(n);
  47.     for (auto &i : p) {
  48.         cin >> i;
  49.     }
  50.  
  51.     int answer = calculateAnswer(p, 0, n - 1);
  52.     cout << answer;
  53. }
  54.  
Advertisement
Add Comment
Please, Sign In to add comment