Wednesday, May 15, 2019

[Timus] K-inversions

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : K-inversions 
Source            : Timus
Category          : Data Structure, Policy Based Data Structure
Algorithm         : PBDS
Verdict           : Accepted 

  1. #include <bits/stdc++.h>  
  2. #include <ext/pb_ds/assoc_container.hpp>  
  3. #include <ext/pb_ds/tree_policy.hpp>  
  4.   
  5. using namespace std;  
  6. using namespace __gnu_pbds;  
  7.   
  8. #define int          long long int  
  9.   
  10. static const int maxn = 20000 + 5;  
  11. static const int mod = 1e9;  
  12.   
  13. template <class Node_CItr, class Node_Itr, class Cmp_Fn, class _Alloc>  
  14. struct my_update_policy  
  15. {  
  16.       virtual Node_CItr node_begin() const = 0;  
  17.       virtual Node_CItr node_end() const = 0;  
  18.       typedef int metadata_type;  
  19.   
  20.       int prefix_sum(int x)  // sum of indices <= x  
  21.       {  
  22.             int ans = 0;  
  23.             auto it = node_begin();  
  24.   
  25.             while (it != node_end())  
  26.             {  
  27.                   auto l = it.get_l_child();  
  28.                   auto r = it.get_r_child();  
  29.   
  30.                   if (Cmp_Fn()(x, (*it)->first))  
  31.                   {  
  32.                         it = l;  
  33.                   }  
  34.                   else  
  35.                   {  
  36.                         ans += (*it)->second;  
  37.                         if (l != node_end()) ans += l.get_metadata();  
  38.                         ans %= mod;  
  39.                         it = r;  
  40.                   }  
  41.             }  
  42.             return ans;  
  43.       }  
  44.       void operator()(Node_Itr it, Node_CItr end_it)  
  45.       {  
  46.             auto l = it.get_l_child();  
  47.             auto r = it.get_r_child();  
  48.             int lft = 0;  
  49.             int rgt = 0;  
  50.             if (l != node_end()) lft = l.get_metadata();  
  51.             if (r != node_end()) rgt = r.get_metadata();  
  52.             const_cast <int&> (it.get_metadata()) = (lft + rgt + (*it)->second) % mod;  
  53.       }  
  54. };  
  55.   
  56. template <class T> using ordermap = tree <T, T, less <T>, rb_tree_tag, my_update_policy>;  
  57.   
  58. signed main()  
  59. {  
  60.       ios_base::sync_with_stdio(false);  
  61.       cin.tie(nullptr);  
  62.       cout.tie(nullptr);  
  63.   
  64.       #ifndef ONLINE_JUDGE  
  65.             freopen("in.txt""r", stdin);  
  66.       #endif // ONLINE_JUDGE  
  67.   
  68.       int n, K;  
  69.       cin >> n >> K;  
  70.   
  71.       vector <int> arr(n+5), temp(n+5);  
  72.       for (int i = 1; i <= n; i++) cin >> arr[i];  
  73.       ordermap <int> om;  
  74.       for (int i = n; i >= 1; i--)  
  75.       {  
  76.             temp[i] = om.prefix_sum(arr[i]);  
  77.             om.insert({arr[i], 1});  
  78.       }  
  79.       for (int k = 3; k <= K; k++)  
  80.       {  
  81.             om.clear();  
  82.             for (int i = n; i >= 1; i--)  
  83.             {  
  84.                   om.insert({arr[i], temp[i]});  
  85.                   temp[i] = om.prefix_sum(arr[i]-1);  
  86.             }  
  87.       }  
  88.       int sum = 0;  
  89.       for (int i = 1; i <= n; i++) sum = (sum + temp[i]) % mod;  
  90.       cout << sum << '\n';  
  91. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.