Advertisement
Guest User

Untitled

a guest
Mar 24th, 2021
822
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5. #include <map>
  6.  
  7. #define all(a) a.begin(), a.end()
  8. #define rall(a) a.rebgin(), a.rend()
  9. #define SOLVE int t; cin >> t; while (t--) solve();
  10.  
  11. using namespace std;
  12.  
  13. void print(vector<int> &a) {
  14.     for (int i : a)
  15.         cout << i << ' ';
  16.     cout << '\n';
  17. }
  18.  
  19. void print(vector<pair<int, int>> &a) {
  20.     for (auto i : a)
  21.         cout << i.first << ':' << i.second << ' ';
  22.     cout << '\n';
  23. }
  24.  
  25. const int N = 3e5 + 228;
  26. pair<int, int> t[4 * N];
  27. int n;
  28.  
  29. void build(int v, int l, int r, vector<pair<int, int>> &a) {
  30.     if (r - l == 1) {
  31.         t[v] = a[l];
  32.         return;
  33.     }
  34.  
  35.     int m = (l + r) / 2;
  36.     build(v * 2 + 1, l, m, a);
  37.     build(v * 2, m, r, a);
  38.     t[v] = min(t[v * 2 + 1], t[v * 2]);
  39. }
  40.  
  41. int d = 0;
  42.  
  43. pair<int, int> get(int v, int l, int r, int L, int R) {
  44.     // cout << l << ' ' << r << ' ' << L << ' ' << R << '\n';
  45.     if (r <= L || R <= l)
  46.         return make_pair((int) 1e9 + 228, 0);
  47.     if (L <= l && r <= R)
  48.         return t[v];
  49.  
  50.     int m = (l + r) / 2;
  51.     return min(get(v * 2 + 1, l, m, L, R), get(v * 2, m, r, L, R));
  52. }
  53.  
  54. int get(int l, int r) {
  55.     return get(1, 0, n, l, r).second;
  56. }
  57.  
  58. vector<int> h;
  59. int sum = 0;
  60.  
  61. long long solve(int l, int r, int t1, int t2) {
  62.     if (r <= l)
  63.         return 0;
  64.     ++sum;
  65.  
  66.     int pos = get(l, r);
  67.     // cout << d << '\n';
  68.     d = 0;
  69.     if (pos < l || pos >= r)
  70.         exit(1);
  71.     long long a1 = solve(l, pos, t1, 1);
  72.     long long a2 = solve(pos + 1, r, 1, t2);
  73.  
  74.     long long res = a1 + a2 + h[pos];
  75.     if (t1 || t2)
  76.         res = max(res, 1ll * 0);
  77.     if (t1)
  78.         res = max(res, max(a2 + h[pos], a2));
  79.     if (t2)
  80.         res = max(res, max(a1 + h[pos], a1));
  81.     return res;
  82. }
  83.  
  84. void solve() {
  85.     cin >> n;
  86.     h.resize(n);
  87.     vector<pair<int, int>> b(n);
  88.     for (int i = 0; i < n; ++i) {
  89.         cin >> b[i].first;
  90.         b[i].second = i;
  91.     }
  92.     for (int i = 0; i < n; ++i) {
  93.         cin >> h[i];
  94.     }
  95.  
  96.     build(1, 0, n, b);
  97.     cout << solve(0, n, 0, 0) << '\n';
  98. }
  99.  
  100. signed main() {
  101.     ios_base::sync_with_stdio(0);
  102.     cout.tie(0);
  103.     cin.tie(0);
  104.  
  105.     solve();
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement