Submission #1072417

#TimeUsernameProblemLanguageResultExecution timeMemory
1072417NeroZeinTricks of the Trade (CEOI23_trade)C++17
5 / 100
2056 ms16168 KiB
#include "bits/stdc++.h" using namespace std; #ifdef Nero #include "Deb.h" #else #define debug(...) #endif const int N = 250003; int n, k; int cl, cr; long long s2; int c[N], s[N]; long long pref[N]; multiset<int> se, se2; void balance() { if ((int) se2.size() > k) { int mn = *se2.begin(); s2 -= mn; se.insert(mn); se2.erase(se2.begin()); } if ((int) se2.size() < k && !se.empty()) { int mx = *se.rbegin(); s2 += mx; se2.insert(mx); se.erase(se.find(mx)); } } void add(int ind) { se2.insert(s[ind]); s2 += s[ind]; balance(); } void rem(int ind) { if (se2.count(s[ind])) { s2 -= s[ind]; se2.erase(se2.find(s[ind])); } else { se.erase(se.find(s[ind])); } balance(); } void edit(int l, int r) { while (cl > l) add(--cl); while (cr < r) add(++cr); while (cl < l) rem(cl++); while (cr > r) rem(cr--); } long long solve(int l, int r, int optl, int optr) { if (l > r) { return -LLONG_MAX; } int mid = (l + r) >> 1; long long ret = -LLONG_MAX; int opt = -1; for (int i = min(mid, optr); i >= optl; --i) { edit(i, mid); if ((int) se2.size() == k) { long long val = pref[mid] - pref[i - 1] + s2; if (val >= ret) { ret = val; opt = i; } } } ret = max(ret, solve(l, mid - 1, optl, opt)); ret = max(ret, solve(mid + 1, r, opt, optr)); return ret; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> c[i]; pref[i] = pref[i - 1] - c[i]; } for (int i = 1; i <= n; ++i) { cin >> s[i]; } cl = 1, cr = 0; cout << solve(1, n, 1, n) << '\n'; 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...