Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <map>
- using namespace std;
- #define ll long long
- vector < pair <ll , ll >> a;
- vector <ll> pref;
- int countRes(ll l, ll r, ll i) {
- ll lsum = pref[i] - pref[l - 1];
- ll rsum = pref[r] - pref[max(i, l)];
- ll res = (rsum - a[i].first * (r - i)) + (max(a[i].first * (i - l + 1) - lsum, 0LL));
- return res;
- }
- int main() {
- ll n, k;
- cin >> n >> k;
- a.resize(1);
- for (int i = 1; i <= n; i++) {
- int c;
- cin >> c;
- a.push_back({ c, i });
- }
- pref.resize(n + 1);
- sort(begin(a), end(a));
- // pref[0] = a[0].first;
- for (int i = 1; i <= n; i++)
- pref[i] = pref[i - 1] + a[i].first;
- ll l = 1;
- ll r = k + 1LL;
- map<ll, ll> ans;
- for (int i = 1; i <= n; i++) {
- if (i > r) {
- r = i;
- l = r - k;
- }
- ll res = countRes(l, r, i);
- ll tmp;
- while (r != n && res > (tmp = countRes(l + 1, r + 1, i))) {
- res = tmp;
- l++; r++;
- }
- if (ans.find(a[i].first) == ans.end())
- ans[a[i].first] = res;
- else
- ans[a[i].first] = min(res, ans[a[i].first]);
- }
- sort(a.begin(), a.end(), [](auto& left, auto& right) {
- return left.second < right.second;
- });
- for (int i = 1; i <= n; i++)
- cout << ans[a[i].first] << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment