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 3000
#define val first
#define res second
#define INF 1000000000000
lli n,a;
lli prim[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 = f;
lli ini = prim[busco-1];
lli a,b,mitad,last = -1;
while (ini <= fin) {
mitad = (ini+fin)/2;
if (res[mitad] == busco) a = dp[mitad].second;
else 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];
}
dp[1] = {arr[1],INF};
res[1] = 1;
prim[1] = 1;
//ciudado con el second 0
rep(i,2,n) {
a = binaria(i,res[i-1]+1);
if (a != -1) {
res[i] = res[i-1]+1;
prim[res[i]] = i;
dp[i].first = acu[i]-acu[a];
a = binaria(i,res[i-1]);
dp[i].second = acu[i] - acu[a];
}
else {
res[i] = res[i-1];
a = binaria(i,res[i-1]);
dp[i].first = acu[i] - acu[a];
if (res[i-1]-1 == 0) dp[i].second = INF;
else {
a = binaria(i,res[i-1]-1);
dp[i].second = acu[i] - acu[a];
}
}
//debugsl(i);
//debugsl(res[i]);
//debugsl(dp[i].first);
//debug(dp[i].second);
}
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... |