Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<pair<int64_t, int64_t>, null_type,less<pair<int64_t, int64_t>>, rb_tree_tag,tree_order_statistics_node_update>
- typedef pair<int64_t, int64_t> ii;
- const int INF = 0x3f3f3f3f;
- int n, k, l;
- vector<int64_t> a, b;
- int64_t sumA, sumB;
- ordered_set os;
- void add(int i, int64_t x) {
- if (os.size() < l) {
- os.insert({x, i});
- sumB += x;
- } else {
- int lt = os.order_of_key({x, INF});
- int ge = os.size() - lt;
- if (ge < l) {
- ii cara = *os.find_by_order(os.size() - l);
- sumB -= cara.first;
- sumB += x;
- os.insert({x, i});
- } else {
- os.insert({x, i});
- }
- }
- }
- void rmv(int i, int64_t x) {
- int lt = os.order_of_key({x, -1});
- int ge = os.size() - lt;
- if (ge > l) {
- os.erase({x, i});
- } else {
- ii cara = *os.find_by_order(os.size() - l - 1);
- sumB += cara.first;
- sumB -= x;
- os.erase({x, i});
- }
- }
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- cin >> n;
- a.assign(n, 0);
- b.assign(n, 0);
- for (int64_t &x : a) {
- cin >> x;
- }
- for (int64_t &x : b) {
- cin >> x;
- }
- cin >> k >> l;
- for (int i = 0; i < k; ++i) {
- sumA += a[i];
- add(i, b[i]);
- }
- int64_t ans = sumA + sumB;
- int final = k - 1, initial = n;
- for (int i = 0; i <= k; ++i) {
- if (final >= 0) rmv(final, b[final]);
- sumA -= a[final];
- --final;
- --initial;
- if (initial < n) add(initial, b[initial]);
- sumA += a[initial];
- ans = max(ans, sumA + sumB);
- }
- cout << ans << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement