Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <set>
- #include <algorithm>
- #include <climits>
- using namespace std;
- #define mp make_pair
- const int MAX_N = 212345;
- struct cmp {
- bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
- return (a.first < b.first) || (a.first == b.first && a.second > b.second);
- }
- };
- int N, K, a[MAX_N], d = 0, min_val = INT_MAX;
- multiset<pair<int, int>, cmp> SET;
- int main() {
- ios_base::sync_with_stdio(0);
- cin >> N >> K;
- for(int i = 0; i < N; ++i) {
- cin >> a[i];
- min_val = min(min_val, a[i]);
- }
- int cur_sum = 0;
- for(int i = 0; i < K; ++i) {
- SET.insert(mp(a[i], i));
- cur_sum += a[i];
- }
- int l = 0, r = K-1;
- while(r < N) {
- if(cur_sum >= 0) {
- multiset<pair<int, int> >::iterator it = SET.begin();
- while(cur_sum >= 0) {
- int min_elem_val = it->first, min_elem_idx = it->second;
- if(l <= min_elem_idx && min_elem_idx <= r && a[min_elem_idx] == min_elem_val) {
- int diff_need = cur_sum+1;
- int diff_can = min_elem_val - min_val;
- int diff_do = min(diff_need, diff_can);
- a[min_elem_idx] -= diff_do;
- d += diff_do;
- cur_sum -= diff_do;
- it++;
- if(diff_do > 0)
- SET.insert(mp(a[min_elem_idx], min_elem_idx));
- } else {
- if(it != SET.end()) {
- multiset<pair<int, int> >::iterator del_it(it);
- it++;
- SET.erase(del_it);
- }
- }
- }
- }
- cur_sum -= a[l];
- if(r+1 < N) {
- cur_sum += a[r+1];
- SET.insert(mp(a[r+1], r+1));
- }
- l++, r++;
- }
- cout << d << '\n';
- for(int i = 0; i < N; ++i)
- cout << a[i] << ' ';
- cout << '\n';
- return 0;
- }
- /*
- 6 1
- 0 0 0 0 0 -1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement