Submission #391512

#TimeUsernameProblemLanguageResultExecution timeMemory
391512_eveBigger segments (IZhO19_segments)C++17
100 / 100
180 ms21232 KiB
#include <bits/stdc++.h>

#define ll long long

using namespace std;

const int N = 500500;
const int mod = 1e9 + 7;
const ll inf = 1e17 + 10;

int n, a[N], sol, dp[N];
ll pref[N];
ll t[N * 4];

void build(int u,int l,int r) {
    t[u] = inf;
    if(l == r) return;
    int m = l + r >> 1;
    build(u << 1,l,m);
    build(u << 1 | 1,m + 1,r);
}

void get(int u,int l,int r,ll val) {
    if(l == r) {
        if(t[u] <= val) {
            sol = l;
        }
        return;
    }
    int m = l + r >> 1;
    if(t[u << 1 | 1] <= val) get(u << 1 | 1,m + 1,r,val);
    else get(u << 1,l,m,val);
}

void upd(int p,ll val,int u,int l,int r) {
    if(l == r) {
        t[u] = val;
        return;
    }
    int m = l + r >> 1;
    if(p <= m) {
        upd(p,val,u << 1,l,m); 
    } else upd(p,val,u << 1 | 1,m + 1,r);
    t[u] = min(t[u << 1],t[u << 1 | 1]);
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        pref[i] = pref[i - 1] + a[i];
    }
    build(1,1,n);
    for(int i = 1; i <= n; i++) {
        sol = 0;
        get(1,1,n,pref[i]);
        dp[i] = dp[sol] + 1;
        upd(i,2 * pref[i] - pref[sol],1,1,n);
    }
    cout << dp[n];
}

Compilation message (stderr)

segments.cpp: In function 'void build(int, int, int)':
segments.cpp:18:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   18 |     int m = l + r >> 1;
      |             ~~^~~
segments.cpp: In function 'void get(int, int, int, long long int)':
segments.cpp:30:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |     int m = l + r >> 1;
      |             ~~^~~
segments.cpp: In function 'void upd(int, long long int, int, int, int)':
segments.cpp:40:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   40 |     int m = l + r >> 1;
      |             ~~^~~
#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...