제출 #883676

#제출 시각아이디문제언어결과실행 시간메모리
883676OAleksaBigger segments (IZhO19_segments)C++14
13 / 100
4 ms15000 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];
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];
   	for (int i = 1;i <= n;i++)
   		p[i] = p[i - 1] + a[i];
   	g[0].push_back({0, 0});
   	int ans;
   	auto check = [&](int x, int i) {
   		int l = 0, r = (int)g[x - 1].size() - 1, k = -1;
   		while (l <= r) {
   			int mid = (l + r) / 2;
   			int u = g[x - 1][mid].f, w = g[x - 1][mid].s;
   			if (p[i] - p[u] >= w) {
   				k = p[i] - p[u];
   				l = mid + 1;
   			}
   			else
   				r = mid - 1;
   		}
   		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;
   		}
   		if (i == n)
   			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...