Advertisement
Guest User

Untitled

a guest
Oct 18th, 2020
619
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long          ll;
  5. typedef long double        ld;
  6. typedef unsigned long long ull;
  7. typedef vector<ll>         vl;
  8. typedef vector<vl>         vvl;
  9. typedef pair<ll,ll>        pll;
  10. typedef vector<pll>        vpll;
  11.  
  12. #define ff          first
  13. #define ss          second
  14. #define pb          push_back
  15. #define eb          emplace_back
  16. #define fr(i,n)     for(ll i = 0; i < n; ++i)
  17. #define frs(i,s,n)  for(ll i = s; i < n; ++i)
  18. #define frb(i,s,e)  for(ll i = s; i <= e; ++i)
  19. #define rfr(i,n)    for(ll i = n-1; i >= 0; i--)
  20. #define frbr(i,e,s) for(ll i = e; i >= s; i--)
  21. #define all(x)      (x).begin(), (x).end()
  22. #define sz(x)       ((ll)(x).size())
  23.  
  24. #ifdef LOCAL
  25. #include <debugger.h>
  26. #else
  27. #define dbg(x...)      {}
  28. #define dbg_arr(a,n)   {}
  29. #define dbg_mat(m,r,c) {}
  30. #define dbg_time()     {}
  31. #endif
  32.  
  33. const ll MOD  = 1e9+7; // 998244353;
  34. const ll INF  = 1e18;
  35. const ll MAX  = 100100;
  36.  
  37.  
  38.  
  39.  
  40. void pre()
  41. {
  42.   // factorizer::sieve();
  43.   // prepare_factorials();
  44. }
  45.  
  46.  
  47. ll slide(ll n, ll k, vl arr)
  48. {
  49.   multiset<ll> right;
  50.   multiset<ll, greater<ll>> left;
  51.   ll l = 0, r = 0;
  52.   ll ls = 0, rs = 0;
  53.   auto balance = [&]()
  54.   {
  55.     if(l > r)
  56.     {
  57.       while(abs(l - r) > 1)
  58.       {
  59.         l--; r++; ls -= *left.begin(); rs += *left.begin();
  60.         right.insert(*left.begin());
  61.         left.erase(left.find(*left.begin()));
  62.       }
  63.     }
  64.     else
  65.     {
  66.       while(abs(l - r) > 1)
  67.       {
  68.         r--; l++; ls += *right.begin(); rs -= *right.begin();
  69.         left.insert(*right.begin());
  70.         right.erase(right.find(*right.begin()));
  71.       }
  72.     }
  73.   };
  74.   auto getMedianCost = [&]()
  75.   {
  76.     balance();
  77.     ll ans = INF;
  78.     if(l == r)
  79.     {
  80.       if(*left.begin() < *right.begin())
  81.         ans = (((*left.begin()) * l) - ls) + (rs - ((*left.begin()) * r));
  82.       else
  83.         ans = (((*right.begin()) * l) - ls) + (rs - ((*right.begin()) * r));
  84.     }
  85.     else
  86.     {
  87.       if(l > r)
  88.        ans = (((*left.begin()) * l) - ls) + (rs - ((*left.begin()) * r));
  89.       else
  90.        ans = (((*right.begin()) * l) - ls) + (rs - ((*right.begin()) * r));
  91.     }
  92.     return ans;
  93.   };
  94.   auto insert_ = [&](ll x)
  95.   {
  96.     if(l > 0)
  97.     {
  98.       if(x <= *left.begin())
  99.       {
  100.         left.insert(x);
  101.         l++; ls += x;
  102.       }
  103.       else
  104.       {
  105.         right.insert(x);
  106.         r++; rs += x;
  107.       }
  108.       balance();
  109.     }
  110.     else if(r > 0)
  111.     {
  112.       if(x >= *right.begin())
  113.       {
  114.         right.insert(x);
  115.         r++; rs += x;
  116.       }
  117.       else
  118.       {
  119.         left.insert(x);
  120.         l++; ls += x;
  121.       }
  122.       balance();
  123.     }
  124.     else
  125.     {
  126.       left.insert(x);
  127.       l++; ls += x;
  128.     }
  129.     return;
  130.   };
  131.   auto delete_ = [&](ll x)
  132.   {
  133.     if(left.count(x))
  134.     {
  135.       left.erase(left.find(x));
  136.       l--; ls -= x;
  137.       balance();
  138.       return;
  139.     }
  140.     if(right.count(x))
  141.     {
  142.       right.erase(right.find(x));
  143.       r--; rs -= x;
  144.       balance();
  145.       return;
  146.     }
  147.   };
  148.   ll minCost = INF;
  149.   fr(i, n)
  150.   {
  151.     if(i > k - 1)
  152.     {
  153.       insert_(arr[i]);
  154.       delete_(arr[i - k]);
  155.       minCost = min(minCost, getMedianCost());
  156.     }
  157.     else
  158.     {
  159.       insert_(arr[i]);
  160.       if(i == k - 1)
  161.         minCost = min(minCost, getMedianCost());
  162.     }
  163.   }
  164.   return minCost;
  165. }
  166.  
  167.  
  168. void solve()
  169. {
  170.   ll w, n; cin >> w >> n;
  171.   vl v(w), v2;
  172.   fr(i, w)
  173.    cin >> v[i];
  174.   sort(all(v));
  175.   fr(i, w)
  176.    v2.pb(v[i]);
  177.   fr(i, w)
  178.    v2.pb(n + v[i]);
  179.   cout << slide(2 * w, w,  v2) << "\n";
  180. }
  181.  
  182.  
  183.  
  184.  
  185. signed main()
  186. {  
  187.   ios::sync_with_stdio(false);
  188.   cin.tie(0); cout.tie(0);
  189.  
  190. #ifdef LOCAL
  191.   freopen("input.txt", "r", stdin);
  192.   freopen("output.txt", "w", stdout);
  193. #endif
  194.  
  195.   // cout << fixed << setprecision(15);
  196.  
  197.   pre();
  198.  
  199.   ll t = 1;
  200.   cin >> t;
  201.   frb(CASE, 1, t)
  202.   {
  203.     cout << "Case #" << CASE << ": ";
  204.     // dbg(CASE);
  205.     solve();
  206.   }
  207.  
  208.   dbg_time();
  209.  
  210.   return 0;
  211. }    
  212.      
  213.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement