Submission #883689

#TimeUsernameProblemLanguageResultExecution timeMemory
883689OAleksaBigger segments (IZhO19_segments)C++14
13 / 100
4 ms15240 KiB
#include<bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define int long long
const int maxn = 5e5 + 69;
const int inf = 1e18;
int n, a[maxn], p[maxn], ptr[maxn];
vector<pair<int, int>> g[maxn];
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
  int tt = 1;
	//cin >> tt;
  while (tt--) {
   	cin >> n;
   	for (int i = 1;i <= n;i++) {
   		cin >> a[i];
   		ptr[i] = -1;
   	}
   	for (int i = 1;i <= n;i++)
   		p[i] = p[i - 1] + a[i];
   	g[0].push_back({0, 0});
   	int ans = 0;
   	auto check = [&](int x, int i) {
   		if (g[x - 1].empty())
   			return -1ll;
   		int t = ptr[x - 1], k = -1;
   		if (t != -1)
   			k = p[i] - p[g[x - 1][t].f];
   		while (t + 1 < (int)g[x - 1].size() && p[i] - p[g[x - 1][t + 1].f] >= g[x - 1][t + 1].s) {
   			k = p[i] - p[g[x - 1][t + 1].f];
   			t++;
   		}
   		ptr[x - 1] = t;
   		return k;
   	};
   	for (int i = 1;i <= n;i++) {
   		int l = 1, r = i, id = 0, sm = 0;
   		while (l <= r) {
   			int mid = (l + r) / 2;
				int gas = check(mid, i);
   			if (gas != -1) {
   				id = mid;
   				sm = gas;
   				l = mid + 1;
   			}
   			else
   				r = mid - 1;
   		}
   		ans = max(ans, id);
   		g[id].push_back({i, sm});
   	}
   	cout << ans;
	}
	return 0;
}
#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...