제출 #344370

#제출 시각아이디문제언어결과실행 시간메모리
344370RedhoodBigger segments (IZhO19_segments)C++14
13 / 100
1 ms364 KiB
#include<bits/stdc++.h>

#define fi first
#define se second
#define all(x) (x).begin() , (x).end()
#define rall(x) (x).rbegin() , (x).rend()
#define pb push_back
#define len(x) (int)(x).size()


using namespace std;

typedef long long ll;
typedef long double ld;


signed main(){
    ios_base::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
    int n;
    cin >> n;
    vector < int > a(n);
    for(auto &i : a)
        cin >> i;
    vector < ll > pref(n + 1);
    for(int i = 0; i < n; ++i){
        pref[i + 1] = pref[i] + a[i];
    }


    vector < pair < int , int > > dp(n + 1 , {0 , 0});
    dp[0] = {0 , 0};


    vector < vector < int > > add(n + 2);

    pair < int , int > cur = {0 , 0};
    for(int i = 0; i <= n; ++i){
        /// lulz
        /// calc dp
        if(i != 0){
            for(auto u : add[i])
                if(cur.fi < dp[u].fi + 1)
                    cur.fi = dp[u].fi + 1 , cur.se = u;
                else if(cur.fi == dp[u].fi + 1)
                    cur.se = max(cur.se , u);
            dp[i] = {cur.fi , pref[i] - pref[cur.se]};
        }
        int frst = lower_bound(all(pref) , pref[i]+dp[i].se) - pref.begin();
        frst = max(frst , i + 1);
        add[frst].pb(i);
    }
//    cout << " DP \n";
//    for(int i = 0; i <= n; ++i){
//        cout << dp[i].fi << ' ' << dp[i].se << '\n';
//    }
    cout << dp[n].fi << '\n';
    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...