이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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,ub;
lli prim[MAX+2],ult[MAX+2],res[MAX+2],arr[MAX+2],acu[MAX+2],bi[MAX+2],bf[MAX+2];
pair<lli,lli> dp[MAX+2];
lli binaria(lli f, lli busco) {
lli fin = bf[busco - 1];
lli ini = bi[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;
bi[1] = bf[1] = 1;
ub = 1;
//ciudado con el second 0
rep(i,2,n) {
dp[i].first = dp[i - 1].first + arr[i];
res[i] = res[i - 1];
repa(g, ub + 1, 2){
a = binaria(i, g);
if (a != -1){
res[i] = max(res[i], res[a] + 1);
dp[i].first = min(dp[i].first, acu[i] - acu[a]);
}
}
if (dp[i].first > dp[i - 1].first){
++ub;
bi[ub] = i;
}
bf[ub] = 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... |