제출 #1289068

#제출 시각아이디문제언어결과실행 시간메모리
1289068LIATricks of the Trade (CEOI23_trade)C++17
10 / 100
8093 ms6320 KiB
#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; priority_queue<ll, vll, greater<ll>> pq; 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; while(!pq.empty()) pq.pop(); 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; } 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); } 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...