Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef unsigned long long ull;
- typedef vector<ll> vl;
- typedef vector<vl> vvl;
- typedef pair<ll,ll> pll;
- typedef vector<pll> vpll;
- #define ff first
- #define ss second
- #define pb push_back
- #define eb emplace_back
- #define fr(i,n) for(ll i = 0; i < n; ++i)
- #define frs(i,s,n) for(ll i = s; i < n; ++i)
- #define frb(i,s,e) for(ll i = s; i <= e; ++i)
- #define rfr(i,n) for(ll i = n-1; i >= 0; i--)
- #define frbr(i,e,s) for(ll i = e; i >= s; i--)
- #define all(x) (x).begin(), (x).end()
- #define sz(x) ((ll)(x).size())
- #ifdef LOCAL
- #include <debugger.h>
- #else
- #define dbg(x...) {}
- #define dbg_arr(a,n) {}
- #define dbg_mat(m,r,c) {}
- #define dbg_time() {}
- #endif
- const ll MOD = 1e9+7; // 998244353;
- const ll INF = 1e18;
- const ll MAX = 100100;
- void pre()
- {
- // factorizer::sieve();
- // prepare_factorials();
- }
- ll slide(ll n, ll k, vl arr)
- {
- multiset<ll> right;
- multiset<ll, greater<ll>> left;
- ll l = 0, r = 0;
- ll ls = 0, rs = 0;
- auto balance = [&]()
- {
- if(l > r)
- {
- while(abs(l - r) > 1)
- {
- l--; r++; ls -= *left.begin(); rs += *left.begin();
- right.insert(*left.begin());
- left.erase(left.find(*left.begin()));
- }
- }
- else
- {
- while(abs(l - r) > 1)
- {
- r--; l++; ls += *right.begin(); rs -= *right.begin();
- left.insert(*right.begin());
- right.erase(right.find(*right.begin()));
- }
- }
- };
- auto getMedianCost = [&]()
- {
- balance();
- ll ans = INF;
- if(l == r)
- {
- if(*left.begin() < *right.begin())
- ans = (((*left.begin()) * l) - ls) + (rs - ((*left.begin()) * r));
- else
- ans = (((*right.begin()) * l) - ls) + (rs - ((*right.begin()) * r));
- }
- else
- {
- if(l > r)
- ans = (((*left.begin()) * l) - ls) + (rs - ((*left.begin()) * r));
- else
- ans = (((*right.begin()) * l) - ls) + (rs - ((*right.begin()) * r));
- }
- return ans;
- };
- auto insert_ = [&](ll x)
- {
- if(l > 0)
- {
- if(x <= *left.begin())
- {
- left.insert(x);
- l++; ls += x;
- }
- else
- {
- right.insert(x);
- r++; rs += x;
- }
- balance();
- }
- else if(r > 0)
- {
- if(x >= *right.begin())
- {
- right.insert(x);
- r++; rs += x;
- }
- else
- {
- left.insert(x);
- l++; ls += x;
- }
- balance();
- }
- else
- {
- left.insert(x);
- l++; ls += x;
- }
- return;
- };
- auto delete_ = [&](ll x)
- {
- if(left.count(x))
- {
- left.erase(left.find(x));
- l--; ls -= x;
- balance();
- return;
- }
- if(right.count(x))
- {
- right.erase(right.find(x));
- r--; rs -= x;
- balance();
- return;
- }
- };
- ll minCost = INF;
- fr(i, n)
- {
- if(i > k - 1)
- {
- insert_(arr[i]);
- delete_(arr[i - k]);
- minCost = min(minCost, getMedianCost());
- }
- else
- {
- insert_(arr[i]);
- if(i == k - 1)
- minCost = min(minCost, getMedianCost());
- }
- }
- return minCost;
- }
- void solve()
- {
- ll w, n; cin >> w >> n;
- vl v(w), v2;
- fr(i, w)
- cin >> v[i];
- sort(all(v));
- fr(i, w)
- v2.pb(v[i]);
- fr(i, w)
- v2.pb(n + v[i]);
- cout << slide(2 * w, w, v2) << "\n";
- }
- signed main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0); cout.tie(0);
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- // cout << fixed << setprecision(15);
- pre();
- ll t = 1;
- cin >> t;
- frb(CASE, 1, t)
- {
- cout << "Case #" << CASE << ": ";
- // dbg(CASE);
- solve();
- }
- dbg_time();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement