#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vll vector<ll>
#define pll pair<ll, ll>
#define tp tuple<ll, ll, ll>
const ll inf = 1e18;
ll ans = -inf;
ll n, k;
vll b, s;
vll pre;
void dc(ll l, ll r, ll optl, ll optr) {
if (l > r)
return;
ll mid = (l + r) / 2;
ll ans_mid = -inf, opt = optl;
ll st = max(optl, mid), ed = optr;
ll sum_k_best = 0;
priority_queue<ll, vll, greater<ll>> pq;
for (ll i = mid; i < st; ++i) {
sum_k_best += s[i];
pq.push(s[i]);
while (pq.size() > k) {
ll node = pq.top();
pq.pop();
sum_k_best -= node;
}
}
for (ll i = st; i <= ed; ++i) {
ll len = i - mid + 1;
pq.push(s[i]);
sum_k_best += s[i];
while (pq.size() > k) {
ll node = pq.top();
pq.pop();
sum_k_best -= node;
}
if (len < k)
continue;
ll sum = pre[i] - (mid == 0 ? 0 : pre[mid - 1]);
ll ans_i = sum_k_best - sum;
if (ans_i > ans_mid) {
ans_mid = ans_i;
opt = i;
}
}
ans = max(ans, ans_mid);
dc(l, mid - 1, optl, opt);
dc(mid + 1, r, opt, optr);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cin >> n >> k;
b.resize(n);
s.resize(n);
pre.resize(n);
for (ll i = 0; i < n; ++i) {
cin >> b[i];
pre[i] = (i == 0 ? 0 : pre[i - 1]) + b[i];
}
for (ll i = 0; i < n; ++i)
cin >> s[i];
dc(0, n - 1, 0, n - 1);
cout << ans << endl;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |