Submission #342604

#TimeUsernameProblemLanguageResultExecution timeMemory
342604SeDunionBigger segments (IZhO19_segments)C++17
0 / 100
1 ms364 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e5 + 55;

ll a[N], p[N];

ll sum(int l, int r) {
	return p[r] - p[l - 1];
}

using pll = pair<ll,ll>;

const ll INF = 1e15;

int L[N * 60], R[N * 60], sz;
pll t[N * 60];

void upd(ll pos, pll val, ll l = -INF, ll r = 1, int v = 0) {
	//cout << v << " " << L[v] << " " << R[v] << endl;;
	t[v] = max(t[v], val);
	if (r - l == 1) {
		return;
	}
	ll m = (l + r) / 2;
	if (pos < m) {
		if (L[v] == 0) L[v] = ++sz;
		upd(pos, val, l, m, L[v]);
	} else {
		if (R[v] == 0) R[v] = ++sz;
		upd(pos, val, m, r, R[v]);
	}
}

pll get(ll Q, ll l = -INF, ll r = 1, int v = 0) {
	if (r <= Q) return t[v];
	if (Q <= l) return {-1, -1};
	ll m = (l + r) / 2;
	pll res = {-1, -1};
	if (L[v]) res = get(Q, l, m, L[v]);
	if (R[v]) res = max(res, get(Q, m, r, R[v]));
	return res;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1 ; i <= n ; ++ i) {
		cin >> a[i];
		p[i] = a[i] + p[i - 1];
	}
	ll mx = 1;
	upd(-sum(1, n), {0, 0});
	for (int i = 1 ; i <= n ; ++ i) {
		auto [s, j] = get(-sum(i + 1, n) + 1);
		j++;
		mx = max(mx, s + 1);
		upd(sum(j, i) - sum(i + 1, n), {s + 1, i});
	}
	cout << mx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...