Advertisement
tiom4eg

CountInv w/ MergeSort

Nov 9th, 2021
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. using namespace std;
  5. using ull = unsigned long long;
  6.  
  7. ull ans;
  8. vector <ull> arr;
  9.  
  10. ull merge (ull b, ull m, ull e) {
  11.     queue <ull> left;
  12.     queue <ull> right;
  13.     for (ull i = b; i <= m; ++i) left.push(arr[i]);
  14.     for (ull i = m + 1; i <= e; ++i) right.push(arr[i]);
  15.     ull idx = b, out = 0;
  16.     while (!left.empty() && !right.empty()) {
  17.         if (left.front() <= right.front()) {
  18.             arr[idx++] = left.front();
  19.             left.pop();
  20.         }
  21.         else {
  22.             arr[idx++] = right.front();
  23.             right.pop();
  24.             out += left.size();
  25.         }
  26.     }
  27.     while (!left.empty()) {
  28.         arr[idx++] = left.front();
  29.         left.pop();
  30.     }
  31.     while (!right.empty()) {
  32.         arr[idx++] = right.front();
  33.         right.pop();
  34.     }
  35.     return out;
  36. }
  37.  
  38. void mergesort(ull b, ull e) {
  39.     if (b < e) {
  40.         ull m = ((b + e) / 2);
  41.         mergesort(b, m);
  42.         mergesort(m + 1, e);
  43.         ans += merge(b, m, e);
  44.     }
  45. }
  46.  
  47. int main() {
  48.     ull n; cin >> n;
  49.     for (ull i = 0; i < n; ++i) {
  50.         ull e; cin >> e;
  51.         arr.push_back(e);
  52.     }
  53.     mergesort(0, n - 1);
  54.     cout << ans;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement