昨天ABC第281场E题,现在还是RE一个点,不知道是什么原因
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200005];
int t[200005];
multiset <int> ss, st;
signed main() {
int n, m, k;
cin >> n >> m >> k;
int tot = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}for (int i = 1; i <= m; i++) {
t[i] = a[i];
}sort(t + 1, t + m + 1);
int nowsum = 0;
for (int i = 1; i <= k; i++) {
nowsum += t[i];
st.insert(t[i]);
}for (int i = k + 1; i <= m; i++) {
ss.insert(t[i]);
}cout << nowsum << " ";
for (int i = 2; i <= n - m + 1; i++) {
if (a[i - 1] <= *(--st.end())) {
st.erase(st.lower_bound(a[i - 1]));
nowsum -= a[i - 1];
}else {
ss.erase(ss.lower_bound(a[i - 1]));
}if (a[i + m - 1] < *(--st.end())) {
st.insert(a[i + m - 1]);
nowsum += a[i + m - 1];
}else {
ss.insert(a[i + m - 1]);
}if (st.size() > k) {
nowsum -= *(--st.end());
ss.insert(*(--st.end()));
st.erase((--st.end()));
}else if (st.size() < k) {
nowsum += *ss.begin();
st.insert(*ss.begin());
ss.erase(ss.begin());
}printf("%lld ", nowsum);
}return 0;
}
st是目前在最小值中的数,ss是不在最小值中的数