4961. 整数删除
作者:
logos--
,
2023-08-03 14:13:46
,
所有人可见
,
阅读 133
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 5e5 + 7, M = 11;
constexpr int inf = 1E18, mod = 1e9 + 7;
int n, k, pre[N], ne[N], cnt[N];
bool vis[N];
inline void Main() {
cin >> n >> k;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> q;
for (int i = 1; i <= n; i ++) {
int x; cin >> x;
q.push(make_pair(x, i));
pre[i] = i - 1;
ne[i] = i + 1;
}
int g = n - k;
while(q.size() > g) {
auto u = q.top();
q.pop();
int x = u.first, y = u.second;
if(cnt[y]) {
q.push(make_pair(x + cnt[y], y));
cnt[y] = 0;
}else {
int l = pre[y], r = ne[y];
vis[y] = true;
cnt[l] += x;
cnt[r] += x;
ne[l] = r;
pre[r] = l;
}
}
vector<int> ans(n + 1);
for (int i = 1; i <= g; i ++) {
auto u = q.top();
q.pop();
ans[u.second] = u.first + cnt[u.second];
}
for (int i = 1; i <= n; i ++) {
if(!vis[i]) {
cout << ans[i] << " ";
}
}
cout << '\n';
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
int T = 1;
while(T --) Main();
return 0;
}