Advertisement
danielvitor23

Numbers on both Sides

Oct 13th, 2022
1,405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #include <ext/pb_ds/assoc_container.hpp>
  5. #include <ext/pb_ds/tree_policy.hpp>
  6. using namespace __gnu_pbds;
  7.  
  8. #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>
  9.  
  10. typedef pair<int64_t, int64_t> ii;
  11.  
  12. const int INF = 0x3f3f3f3f;
  13.  
  14. int n, k, l;
  15. vector<int64_t> a, b;
  16. int64_t sumA, sumB;
  17.  
  18. ordered_set os;
  19.  
  20. void add(int i, int64_t x) {
  21.   if (os.size() < l) {
  22.     os.insert({x, i});
  23.     sumB += x;
  24.   } else {
  25.     int lt = os.order_of_key({x, INF});
  26.     int ge = os.size() - lt;
  27.     if (ge < l) {
  28.       ii cara = *os.find_by_order(os.size() - l);
  29.       sumB -= cara.first;
  30.       sumB += x;
  31.       os.insert({x, i});
  32.     } else {
  33.       os.insert({x, i});
  34.     }
  35.   }
  36. }
  37.  
  38. void rmv(int i, int64_t x) {
  39.   int lt = os.order_of_key({x, -1});
  40.   int ge = os.size() - lt;
  41.   if (ge > l) {
  42.     os.erase({x, i});
  43.   } else {
  44.     ii cara = *os.find_by_order(os.size() - l - 1);
  45.     sumB += cara.first;
  46.     sumB -= x;
  47.     os.erase({x, i});
  48.   }
  49. }
  50.  
  51. int main() {
  52.   cin.tie(0)->sync_with_stdio(0);
  53.  
  54.   cin >> n;
  55.  
  56.   a.assign(n, 0);
  57.   b.assign(n, 0);
  58.  
  59.   for (int64_t &x : a) {
  60.     cin >> x;
  61.   }
  62.  
  63.   for (int64_t &x : b) {
  64.     cin >> x;
  65.   }
  66.  
  67.   cin >> k >> l;
  68.  
  69.   for (int i = 0; i < k; ++i) {
  70.     sumA += a[i];
  71.     add(i, b[i]);
  72.   }
  73.  
  74.   int64_t ans = sumA + sumB;
  75.  
  76.   int final = k - 1, initial = n;
  77.   for (int i = 0; i <= k; ++i) {
  78.     if (final >= 0) rmv(final, b[final]);
  79.     sumA -= a[final];
  80.     --final;
  81.     --initial;
  82.     if (initial < n) add(initial, b[initial]);
  83.     sumA += a[initial];
  84.  
  85.     ans = max(ans, sumA + sumB);
  86.   }
  87.  
  88.   cout << ans << '\n';
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement