Submission #402842

#TimeUsernameProblemLanguageResultExecution timeMemory
402842gevacrtHacker (BOI15_hac)C++17
100 / 100
411 ms22340 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

#define INF INT_MAX
#define MOD 1000000007
#define all(x) x.begin(), x.end()

template<class T, void UPDATE(T&, T), T MERGE(T, T)>
struct SEGMENT_TREE {
    int range_l, range_r;
    vector<T> V, lazy; T DEF;

    SEGMENT_TREE(int l, int r, T def = T{}){
        DEF = def;
        V.resize(4*(r-l+1), DEF);
        lazy.resize(4*(r-l+1), DEF);
        range_l = l, range_r = r;
    }

    void lazyUpdate(int n, int l, int r){
        if(lazy[n] == DEF) return;
        UPDATE(V[n], lazy[n]);
        if(l < r){
            UPDATE(lazy[2*n], lazy[n]);
            UPDATE(lazy[2*n+1], lazy[n]);
        }
        lazy[n] = DEF;
    }

    void update(int n, int l, int r, int L, int R, T val){
        lazyUpdate(n, l, r);
        if(r < L or R < l) return;
        if(L <= l and r <= R){
            UPDATE(lazy[n], val);
            lazyUpdate(n, l, r);
            return;
        }

        int m = (l+r)/2;
        update(n*2, l, m, L, R, val);
        update(n*2+1, m+1, r, L, R, val);
        V[n] = MERGE(V[n*2], V[n*2+1]);
    }

    T query(int n, int l, int r, int L, int R){
        lazyUpdate(n, l, r);
        if(r < L or R < l) return DEF;
        if(L <= l and r <= R) return V[n];

        int m = (l+r)/2;
        return MERGE(query(n*2, l, m, L, R),
        query(n*2+1, m+1, r, L, R));
    }

    void update(int L, T val){
        update(1, range_l, range_r, L, L, val);
    }
    T query(int L, int R){
        if(L <= R) return query(1, range_l, range_r, L, R);
        return min(query(1, range_l, range_r, L, range_r),
            query(1, range_l, range_r, 0, R)); 
    }
};

void seg_upd(int &a, int b){a = b;}
int seg_merge(int a, int b){return min(a, b);}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N; cin >> N;
    vi V(N); for(auto &i : V) cin >> i;

    auto bb = [&](int x){
        return (x+N)%N;
    };

    vi sum(N); int sz = (N+1)/2;
    sum[sz-1] = accumulate(V.begin(), V.begin()+sz, 0);

    for(int x = sz; x != sz-1; x = bb(x+1)){
        sum[x] = V[x]+sum[bb(x-1)]-V[bb(x-sz)];
    }

    SEGMENT_TREE<int, seg_upd, seg_merge> ST(0, N-1, INF);
    for(int x = 0; x < N; x++) ST.update(x, sum[x]); 

    int ans = 0;
    for(int x = 0; x < N; x++)
        ans = max(ans, ST.query(x, bb(x+sz-1)));

    cout << ans << endl;

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