Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <map>
- #define all(a) a.begin(), a.end()
- #define rall(a) a.rebgin(), a.rend()
- #define SOLVE int t; cin >> t; while (t--) solve();
- using namespace std;
- void print(vector<int> &a) {
- for (int i : a)
- cout << i << ' ';
- cout << '\n';
- }
- void print(vector<pair<int, int>> &a) {
- for (auto i : a)
- cout << i.first << ':' << i.second << ' ';
- cout << '\n';
- }
- const int N = 3e5 + 228;
- pair<int, int> t[4 * N];
- int n;
- void build(int v, int l, int r, vector<pair<int, int>> &a) {
- if (r - l == 1) {
- t[v] = a[l];
- return;
- }
- int m = (l + r) / 2;
- build(v * 2 + 1, l, m, a);
- build(v * 2, m, r, a);
- t[v] = min(t[v * 2 + 1], t[v * 2]);
- }
- int d = 0;
- pair<int, int> get(int v, int l, int r, int L, int R) {
- // cout << l << ' ' << r << ' ' << L << ' ' << R << '\n';
- if (r <= L || R <= l)
- return make_pair((int) 1e9 + 228, 0);
- if (L <= l && r <= R)
- return t[v];
- int m = (l + r) / 2;
- return min(get(v * 2 + 1, l, m, L, R), get(v * 2, m, r, L, R));
- }
- int get(int l, int r) {
- return get(1, 0, n, l, r).second;
- }
- vector<int> h;
- int sum = 0;
- long long solve(int l, int r, int t1, int t2) {
- if (r <= l)
- return 0;
- ++sum;
- int pos = get(l, r);
- // cout << d << '\n';
- d = 0;
- if (pos < l || pos >= r)
- exit(1);
- long long a1 = solve(l, pos, t1, 1);
- long long a2 = solve(pos + 1, r, 1, t2);
- long long res = a1 + a2 + h[pos];
- if (t1 || t2)
- res = max(res, 1ll * 0);
- if (t1)
- res = max(res, max(a2 + h[pos], a2));
- if (t2)
- res = max(res, max(a1 + h[pos], a1));
- return res;
- }
- void solve() {
- cin >> n;
- h.resize(n);
- vector<pair<int, int>> b(n);
- for (int i = 0; i < n; ++i) {
- cin >> b[i].first;
- b[i].second = i;
- }
- for (int i = 0; i < n; ++i) {
- cin >> h[i];
- }
- build(1, 0, n, b);
- cout << solve(0, n, 0, 0) << '\n';
- }
- signed main() {
- ios_base::sync_with_stdio(0);
- cout.tie(0);
- cin.tie(0);
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement