| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1289066 | LIA | Tricks of the Trade (CEOI23_trade) | C++17 | 0 ms | 0 KiB |
void dc(ll l, ll r, ll optl, ll optr) {
if (l > r)
return;
ll mid = (l + r) / 2;
ll st = max(optl, mid + k - 1), ed = optr;
ll ans_mid = -inf, opt = st;
// if (st > ed) {
// ll pass_opt = max(optl, mid + k - 1);
// dc(l, mid - 1, optl, min(optr, max(pass_opt, optl)));
// dc(mid + 1, r, max(optl, pass_opt), optr);
// return;
// }
priority_queue<ll, vll, greater<ll>> pq;
ll sum_k_best = 0;
for (ll t = mid; t < st; ++t) {
pq.push(s[t]);
sum_k_best += s[t];
if (pq.size() > k) {
sum_k_best -= pq.top();
pq.pop();
}
}
for (ll i = st; i <= ed; ++i) {
pq.push(s[i]);
sum_k_best += s[i];
if (pq.size() > k) {
sum_k_best -= pq.top();
pq.pop();
}
ll sum = pre[i] - (mid == 0 ? 0 : pre[mid - 1]);
ll cur = sum_k_best - sum;
if (cur > ans_mid || (cur == ans_mid && i < opt)) {
ans_mid = cur;
opt = i;
}
}
ans = max(ans, ans_mid);
dc(l, mid - 1, optl, opt);
dc(mid + 1, r, opt, optr);
}
