Submission #1192897

#TimeUsernameProblemLanguageResultExecution timeMemory
1192897lopkusBigger segments (IZhO19_segments)C++20
100 / 100
50 ms15944 KiB
#pragma GCC optimize("O3")
#include<bits/stdc++.h>

#define ll long long
#define pb push_back
#define in insert
#define fi first
#define se second
#define vl vector<ll>
#define all(v) v.begin(), v.end()
#define endl '\n'

using namespace std;
const int sz = 1e5 + 5; /// mind this
const int MAX = 1e6 + 123;
const int BL = 300;
const int lg = 20;
bool cmp(array<ll, 2> A, array<ll, 2> B){
    if(A[0] == B[0]){
        return A[1] > B[1];
    }
    return A[0] < B[0];
}
void solve(){
    ll n, i, j, ans = 0;
    cin >> n;
    vl v(n + 1), p(n + 1);
    vector<array<ll, 2>> dp(n + 1);
    p[0] = 0;
    for(i = 1; i <= n; i++){
        cin >> v[i];
        p[i] = p[i - 1] + v[i];
    }
    for(i = 1; i <= n; i++){
        dp[i] = {1, p[i]};
    }
    array<ll, 2> cur = {0, 0};
    for(i = 1; i <= n; i++){
        cur[1] += v[i];
        cur = max(cur, dp[i], cmp);
        ll lo = i + 1, hi = n, mid, best = n + 1;
        while(lo <= hi){
            mid = (lo + hi) >> 1;
            if((p[mid] - p[i]) >= cur[1]){
                best = mid;
                hi = mid - 1;
            }
            else{
                lo = mid + 1;
            }
        }
        if(best <= n){
            dp[best] = {cur[0] + 1, p[best] - p[i]};
        }
    }
    for(i = 1; i <= n; i++){
        ans = max(ans, dp[i][0]);
    }
    cout << ans << endl;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll t = 1;
    // cin >> t;
    while(t--){
        solve();
    }   
}
/*
*/

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