Advertisement
Mehulcoder

Number of Inversions

Oct 31st, 2020 (edited)
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. /*
  2. Author: Mehul Chaturvedi
  3. Talent is overrated
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. using ll = int;
  10. using ld = long double;
  11. using pll = pair<ll, ll>;
  12.  
  13. #define mp make_pair
  14. #define all(x) (x).begin(), (x).end()
  15. #define f first
  16. #define s second
  17. #define vll vector<long long>
  18. #define vvll vector<vector<ll>>
  19. #define vset(v, n, val) \
  20.     v.clear();          \
  21.     v.resize(n, val)
  22. #define INF 4557430888798830399ll
  23. #define fr(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
  24. #define rep(i, n) for (int i = 0, _n = (n); i < _n; i++)
  25. #define repr(i, n) for (int i = n; i >= 0; i--)
  26. #define frr(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
  27. #define trav(a, x) for (auto &a : x)
  28. #define fil(ar, val) memset(ar, val, sizeof(ar))
  29. const ll MOD = 1e9 + 7;
  30.  
  31. /*
  32.     At each node representin [tl,tr), I store the sorted array from tl to tr-1
  33.     Rest is pretty trivial? Just use lower_bound
  34. */
  35.  
  36. class node {
  37.     public:
  38.     vll arr;
  39.  
  40.     node(vll val) {
  41.         arr = val;
  42.     }
  43. };
  44.  
  45. vector<ll> v;
  46. vector<node> t;
  47. ll n, m;
  48. ll anss;
  49.  
  50. node help(node &left, node &right) {
  51.     vll &arr1 = left.arr;
  52.     vll &arr2 = right.arr;
  53.  
  54.     vll arr0;
  55.     arr0.resize(arr1.size() + arr2.size());
  56.     merge(all(arr1), all(arr2), arr0.begin());
  57.    
  58.     node res(arr0);
  59.     return res;
  60. }
  61.  
  62. void build(ll start, ll tl, ll tr) {
  63.     if (tl + 1 == tr) {
  64.         t[start] = node({v[tl]});
  65.         return;
  66.     }
  67.  
  68.     ll mid = (tl + tr) / 2;
  69.     build(2 * start + 1, tl, mid);
  70.     build(2 * start + 2, mid, tr);
  71.    
  72.     node &left = t[2 * start + 1];
  73.     node &right = t[2 * start + 2];
  74.    
  75.     t[start] = help(left, right);
  76.     return;
  77. }
  78.  
  79. ll get(ll start, ll tl, ll tr, ll l, ll r, ll num) {
  80.     if (tl >= r || tr <= l) {
  81.         // anss = 0;
  82.         return 0;
  83.     }
  84.  
  85.     if (l <= tl && r >= tr) {
  86.         vll &temp = (t[start]).arr;
  87.         ll anss = lower_bound(all(temp), v[l]) - temp.begin();
  88.         return anss;
  89.     }
  90.  
  91.     ll mid = (tl + tr) / 2;
  92.     ll left = get(2 * start + 1, tl, mid, l, r, num);
  93.     ll right = get(2 * start + 2, mid, tr, l, r, num);
  94.     ll ans = left+right;
  95.  
  96.     return ans;
  97. }
  98.  
  99. vector<int> solve(vector<int> &nums) {
  100.     t.clear();
  101.     n = nums.size();
  102.     if (n == 0) return {};
  103.    
  104.     v = nums;
  105.     t.resize(4 * n, node({}));
  106.    
  107.     build(0, 0, n);
  108.     ll q = nums.size();
  109.  
  110.     vector<int> ress;
  111.     ll l = 0;
  112.     while (q--) {
  113.         auto temp = get(0, 0, n, l, n, v[l]);
  114.         l++;
  115.         ress.push_back(temp);
  116.     }
  117.  
  118.     return ress;
  119. }
  120.  
  121. class Solution {
  122. public:
  123.     vector<int> countSmaller(vector<int>& nums) {
  124.         return solve(nums);
  125.     }
  126. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement