Advertisement
Guest User

Problem D (inversions), contest 3

a guest
Mar 23rd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int inv=0;
  4. vector <long long> mergesort(vector <long long> v, int i, int j){
  5.     if (i==j) {
  6.         vector<long long> ans;
  7.         ans.push_back(v[i]);
  8.         return ans;
  9.     }
  10.     int mid = (i+j)/2;
  11.     vector <long long> lv = mergesort(v, i, mid), rv = mergesort(v, mid+1, j), ans;
  12.     int l=0, r=0;
  13.     while (l<mid-i+1 or r<j-mid) {
  14.         if(l>=mid-i+1) ans.push_back(rv[r++]);
  15.         else if(r>=j-mid) ans.push_back(lv[l++]);
  16.         else if(rv[r]>=lv[l]) ans.push_back(lv[l++]);
  17.         else ans.push_back(rv[r++]), inv+=mid-i+1-l;
  18.     }
  19.     return ans;
  20. }
  21. int main(){
  22.     ios_base::sync_with_stdio (0);
  23.     cin.tie(0);
  24.     int t, n, x;
  25.     cin >> t;
  26.     for(int i=1; i<=t; i++){
  27.         cin >> n;
  28.         inv=0;
  29.         vector <long long> v;
  30.         for(int j=1; j<=n; j++){
  31.             cin >> x;
  32.             v.push_back(x);
  33.         }
  34.         mergesort(v, 0, n-1);
  35.         cout <<inv<<endl;
  36.     }
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement