Submission #1355241

#TimeUsernameProblemLanguageResultExecution timeMemory
1355241samarthkulkarniBitaro the Brave 2 (JOI25_ho_t2)C++20
100 / 100
139 ms31756 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template <typename T>
using ordered_set = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>;

using ll = long long;
using vi = vector<long long>;
using pr = pair<ll, ll>;
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#define endl "\n"

const int mod = 1000000007;
const int emod = 998244353;

int msb(ll x){if(x==0)return -1;return 63-__builtin_clzll(x);}
ll exp(ll x, ll y){ll ans=1;while(y>0){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans;}
ll madd(ll x, ll y) {return (x%mod + y%mod)%mod;}
ll msub(ll x, ll y) {return (x%mod - y%mod + mod)%mod;}
ll mmul(ll x, ll y) {return ((x%mod)*(y%mod))%mod;}
ll mdiv(ll x, ll y) {return (x%mod)*exp(y, mod-2)%mod;}


void solution();
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solution();
    return 0;
}


struct Node {
	ll mx, val;
	Node() {mx = -1e18, val = 0;}
};

Node _merge(Node a1, Node a2) {
	a2.val += a1.val;
	a2.mx = max(a1.mx, a2.mx-a1.val);
	return a2;
}

struct SegTree {
	vector<Node> tree;
	vi a, b;
	ll n;

	SegTree(const vi &_a, const vi &_b) {
		a = _a;
		b = _b;
		n = a.size();
		tree.resize(n<<1);

		for (int i = 0; i < n; i++) {
			tree[i+n].mx = a[i];
			tree[i+n].val = b[i];
		}
		for (int i = n-1; i > 0; i--) {
			tree[i] = _merge(tree[i<<1], tree[i<<1|1]);
		}
	}

	void update(int i, ll val, ll mx) {
		i+=n;
		tree[i].mx = mx;
		tree[i].val = val;

		for (i>>=1; i > 0; i>>=1) {
			tree[i] = _merge(tree[i<<1], tree[i<<1|1]);
		}
	}

	Node query(int l, int r) {
		if (l>r) return Node();
		Node L, R;

		for (l+=n, r+=n; l<=r; l >>=1, r >>=1) {
			if (l&1) L = _merge(L, tree[l++]);
			if (r&1^1) R = _merge(tree[r--], R);
		}

		return _merge(L, R);

	}
};


void solution() {
    ll n; cin >> n;
    vi a(n), b(n);
    for (ll &z : a) cin >> z;
    for (ll &z : b) cin >> z;

    SegTree m(a, b);
	

	ll ans = 1e18;
	for (int i = 0; i < n; i++) {
		ll k = b[0];
		ll p = a[0];

		Node t = m.query(i, n-1);
		m.update(0, t.val+k, p-(t.val));
		ans = min(ans, max(t.mx, m.query(0, i-1).mx));
		m.update(0, k, p);

		
	}
	cout << ans << endl;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...