Submission #603315

#TimeUsernameProblemLanguageResultExecution timeMemory
603315OzyBigger segments (IZhO19_segments)C++17
13 / 100
1 ms340 KiB
#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-1;
    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 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...