제출 #501660

#제출 시각아이디문제언어결과실행 시간메모리
501660LucaIlieBigger segments (IZhO19_segments)C++17
100 / 100
228 ms18844 KiB
#include <iostream>

using namespace std;

#define MAX_N 1000000

struct DP {
    int segm;
    long long suma;
};

int v[MAX_N + 1];
long long sp[MAX_N + 1];
DP dp[MAX_N + 1];

int main() {
    int n, st, dr, mij, i, j;

    cin >> n;
    for ( i = 1; i <= n; i++ ) {
        cin >> v[i];
        sp[i] = sp[i - 1] + v[i];
    }

    dp[0] = { 1, 0 };
    j = 1;
    for ( i = 1; i <= n; i++ ) {
        if ( dp[i - 1].segm > dp[i].segm )
            dp[i] = { dp[i - 1].segm, dp[i - 1].suma + v[i] };
        else if ( dp[i - 1].segm == dp[i].segm ) {
            if ( dp[i - 1].suma + v[i] < dp[i].suma )
                dp[i].suma = dp[i - 1].suma + v[i];
        }

        if  ( i < n ) {
            st = i;
            dr = n;
            while ( dr - st > 1 ) {
                mij = (st + dr) / 2;

                if ( sp[mij] - sp[i] < dp[i].suma )
                    st = mij;
                else
                    dr = mij;
            }

            j = dr;
            if ( sp[j] - sp[i] >= dp[i].suma ) {
                if ( dp[i].segm + 1 > dp[j].segm )
                    dp[j] = { dp[i].segm + 1, sp[j] - sp[i] };
                else if ( dp[i].segm + 1 == dp[j].segm ) {
                    if ( sp[j] - sp[i] < dp[j].suma )
                        dp[j].suma = sp[j] - sp[i];
                }
            }
        }
    }

    cout << dp[n].segm;

    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...