This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define rep(i,a,b) for (int i = (a); i <= (b);i++)
#define repa(i,a,b) for (int i = (a); i >= (b);i--)
#define debug(a) cout << #a << " = " << a << endl
#define debugsl(a) cout << #a << " = " << a << ", "
#define MAX 500000
#define val first
#define res second
#define INF 1000000000000
lli n,a;
lli prim[MAX+2],ult[MAX+2],res[MAX+2],arr[MAX+2],acu[MAX+2];
pair<lli,lli> dp[MAX+2];
lli binaria(lli f, lli busco) {
lli fin = ult[busco - 1];
lli ini = prim[busco - 1];
lli a,b,mitad,last = -1;
while (ini <= fin) {
mitad = (ini+fin)/2;
a = dp[mitad].first;
b = acu[f] - acu[mitad];
if (a <= b) {
last = mitad;
ini = mitad+1;
}
else fin = mitad-1;
}
return last;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
rep(i,1,n) {
cin >> arr[i];
acu[i] = arr[i] + acu[i-1];
}
fill(prim, prim + 1 + n, n);
dp[1] = {arr[1],INF};
res[1] = 1;
prim[1] = ult[1] = 1;
//ciudado con el second 0
rep(i,2,n) {
dp[i].first = acu[i];
res[i] = 1;
repa(g, res[i - 1] + 1, 2){
a = binaria(i, g);
if (a != -1){
res[i] = max(res[i], (lli)g);
dp[i].first = min(dp[i].first, acu[i] - acu[a]);
prim[g] = min(prim[g], (lli)a + 1);
break;
}
}
ult[res[i]] = i;
}
cout << res[n];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |