Submission #1271076

#TimeUsernameProblemLanguageResultExecution timeMemory
1271076yeulerBigger segments (IZhO19_segments)C++20
0 / 100
0 ms328 KiB
/*

subtask 2 -> dp[i] = max(dp[i], dp[j]+1) -> dengan syarat dari j+1 hingga
i > total segment sebelumnya
maintain dp[j] max brp segment, total segment sekecil mungkin berapa

subtask 3 -> optimasi

subtask 5 -> O(N)
ubah dp menjadi dp push
dp[j] > dp[j-1]
cari nilai terdekat di depan yang segmentnya lebih besar
dari segmen sekarang (binser)

*/

#include <bits/stdc++.h>
#define ll long long
#define KAGAMINE ios_base::sync_with_stdio(false);
#define LEN cin.tie(NULL);
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define pb push_back
#define vector2d(x) vector<vector<x>>
#define pii pair<int, int>
#define pl pair<ll, ll>
using namespace std;

int main(){
    KAGAMINE LEN

    ll n; cin >> n;

    vector<ll> ar(n+5);
    vector<ll> dp(n+5, 0), pos(n+5, 0);


    vector<ll> pf(n+5);

    for (ll i = 1; i <= n; i++){
        cin >> ar[i];
    }

    pf[0] = 0;
    pf[n+1] = 1e18;
    for (ll i = 1; i <= n; i++){
        pf[i] = pf[i-1]+ar[i];
    }

    for (ll i = 1; i <= n; i++){
        pos[i] = max(pos[i],pos[i-1]);
        dp[i] = dp[pos[i]]+1;
        ll lb = lower_bound(pf.begin()+1, pf.end(), pf[i]*2 - pf[pos[i]]) - pf.begin();
        pos[lb] = i;
    }

    cout << dp[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...