Advertisement
BaoJIaoPisu

Untitled

Jun 18th, 2022
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define pf push_front
  6. #define popb pop_back
  7. #define popf pop_front
  8. #define ins insert
  9. #define pq priority_queue
  10. #define minele min_element
  11. #define maxele max_element
  12. #define lb lower_bound //first pos >= val
  13. #define ub upper_bound // first pos > val
  14. #define cnt_bit __builtin_popcount
  15. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  16. //#pragma GCC optimize("Ofast")
  17. //#pragma GCC target("avx,avx2,fma")
  18. using namespace std;
  19.  
  20. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  21.  
  22. typedef long long ll;
  23. typedef pair<ll, ll> pll;
  24. typedef pair<int, int> pii;
  25.  
  26.  
  27. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  28. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  29. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  30.  
  31. const ll oo = 1e18;
  32. const ll maxN = 3e5 + 100;
  33.  
  34. /* Author : Le Ngoc Bao Anh, 10A5, LQD High School for Gifted Student */
  35.  
  36. void maximize(ll &a, ll b) {
  37.     if(a < b) a = b;
  38. }
  39.  
  40. void minimize(ll &a, ll b) {
  41.     if(a > b) a = b;
  42. }
  43.  
  44. ll Node[maxN * 4], Lazy[maxN * 4], dp[maxN];
  45. int L[maxN], R[maxN], L2[maxN], R2[maxN];
  46. ll a[maxN], b[maxN];
  47. ll rmq[maxN][18];
  48.  
  49. void Down(int id) {
  50.     ll x = Lazy[id]; Lazy[id] = -oo;
  51.     maximize(Node[id * 2], x); maximize(Node[id * 2 + 1], x);
  52.     maximize(Lazy[id * 2], x); maximize(Lazy[id * 2 + 1], x);
  53. }
  54.  
  55. void Update(int L, int R, int lo, int hi, int id, ll x) {
  56.     if(L > hi || R < lo) return;
  57.     if(lo <= L && R <= hi) {
  58.         maximize(Node[id], x);
  59.         maximize(Lazy[id], x);
  60.         return;
  61.     }
  62.  
  63.     Down(id);
  64.     int mid = (L + R) >> 1;
  65.     Update(L, mid, lo, hi, id * 2, x);
  66.     Update(mid + 1, R, lo, hi, id * 2 + 1, x);
  67.     Node[id] = max(Node[id * 2], Node[id * 2 + 1]);
  68. }
  69.  
  70. ll Get(int L, int R, int lo, int hi, int id) {
  71.     if(L > hi || R < lo) return -oo;
  72.     if(lo <= L && R <= hi) return Node[id];
  73.  
  74.     Down(id);
  75.     int mid = (L + R) >> 1;
  76.     return max(Get(L, mid, lo, hi, id * 2), Get(mid + 1, R, lo, hi, id * 2 + 1));
  77. }
  78.  
  79. void solve() {
  80.     int n; cin >> n;
  81.     for(int i = 1; i <= n; i++) cin >> a[i];
  82.     for(int i = 1; i <= n; i++) cin >> b[i];
  83.  
  84.     int g = 17;
  85.     for(int i = 1; i <= n; i++) rmq[i][0] = b[i];
  86.     for(int j = 1; j <= g; j++) {
  87.         for(int i = 1; i <= n; i++) {
  88.             if(i + (1 << j) - 1 > n) break;
  89.             rmq[i][j] = max(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
  90.         }
  91.     }
  92.  
  93.     stack<int> q;
  94.  
  95.     //cal L
  96.     for(int i = 1; i <= n; i++) {
  97.         while(!q.empty()) {
  98.             if(b[q.top()] < b[i]) q.pop();
  99.             else break;
  100.         }
  101.  
  102.         if(!q.empty()) L[i] = q.top();
  103.         q.push(i);
  104.     }
  105.  
  106.     //cal R
  107.     while(!q.empty()) q.pop();
  108.     for(int i = n; i >= 1; i--) {
  109.         while(!q.empty()) {
  110.             if(b[q.top()] < b[i]) q.pop();
  111.             else break;
  112.         }
  113.  
  114.         if(!q.empty()) R[i] = q.top();
  115.         else R[i] = n + 1;
  116.         q.push(i);
  117.     }  
  118.  
  119.     auto get_max = [&](int L, int R) -> int {
  120.         int len = (R - L + 1);
  121.         int x = log2(len);
  122.         return max(rmq[L][x], rmq[R - (1 << x) + 1][x]);
  123.     };
  124.  
  125.     //Cal L2
  126.     for(int i = 1; i <= n; i++) {
  127.         if(!L[i]) continue;
  128.         int lo = 1, hi = L[i] - 1;
  129.         while(lo <= hi) {
  130.             int mid = (lo + hi) >> 1;
  131.             if(get_max(mid, L[i] - 1) > b[i]) {
  132.                 L2[i] = mid;
  133.                 lo = mid + 1;
  134.             } else {
  135.                 hi = mid - 1;
  136.             }
  137.         }
  138.     }
  139.  
  140.     //cal R2
  141.     for(int i = 1; i <= n; i++) {
  142.         if(R[i] > n) {
  143.             R2[i] = n + 1;
  144.             continue;
  145.         }
  146.         R2[i] = n + 1;
  147.         int lo = R[i] + 1, hi = n;
  148.         while(lo <= hi) {
  149.             int mid = (lo + hi) >> 1;
  150.             if(get_max(R[i] + 1, mid) > b[i]) {
  151.                 R2[i] = mid;
  152.                 hi = mid - 1;
  153.             } else {
  154.                 lo = mid + 1;
  155.             }
  156.         }
  157.     }
  158.  
  159.     for(int i = 1; i <= n; i++) dp[i] = -oo;
  160.     for(int i = 1; i <= 4 * (n + 1); i++) Node[i] = Lazy[i] = -oo;
  161.     Update(0, n, 0, 0, 1, 0);
  162.  
  163.     for(int i = 1; i <= n; i++) {
  164.         dp[i] = Get(0, n, i, i, 1);
  165.         ll g = -oo;
  166.         if(L[i]) {
  167.             g = Get(0, n, L2[i], L[i] - 1, 1);
  168.             dp[i] = max(dp[i], g + a[i]);
  169.         }
  170.  
  171.         ll x = Get(0, n, L[i], i - 1, 1);
  172.         if(R[i] <= n) {
  173.             Update(0, n, R[i], R2[i] - 1, 1, x + a[i]);
  174.         }
  175.         if(i <= R[i] - 2) Update(0, n, i + 1, R[i] - 1, 1, g + a[i]);
  176.         Update(0, n, i, i, 1, dp[i]);
  177.     }
  178.  
  179.     cout << dp[n];
  180. }
  181.  
  182. int main()
  183. {
  184.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  185.     // #ifndef ONLINE_JUDGE
  186.     // freopen("input.txt", "r", stdin);
  187.     // freopen("output.txt", "w", stdout);
  188.     // #else
  189.     // //online
  190.     // #endif
  191.  
  192.     int tc = 1, ddd = 0;
  193.     // cin >> tc;
  194.     while(tc--) {
  195.         //ddd++;
  196.         //cout << "Case #" << ddd << ": ";
  197.         solve();
  198.     }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement