Submission #1299297

#TimeUsernameProblemLanguageResultExecution timeMemory
1299297dhuyyyyHacker (BOI15_hac)C++20
100 / 100
309 ms35668 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
#define pii pair<int,int>
#define all(s) s.begin(),s.end()
#define sz(s) (int)s.size()
#define dbg(x) "[" #x << " = " << x << "]"

using namespace std;

using ll = long long;
using ii = pair<int,int>;
using aa = array<int,3>;

bool maximize(int& a,int b){
    if (a > b) return 0;
    a = b;
    return 1;
}
bool minimize(int &a,int b){
    if (a <= b) return 0;
    a = b;
    return 1;
}

const int N = 5e5+5;
const int INF = 1e18;
const int MOD = 1e9+9999;

int n, mid, ans = 0, cur = 0;

int pre[N];

struct SMT{
    int n;
    vector <int> t, lazy;
    SMT (int _n = 0) : n(_n){
        t.assign((n << 2) + 5,INF);
        lazy.assign((n << 2) + 5,INF);
    }
    void push(int id,int l,int r){
        if (l == r) return;
        minimize(t[id * 2],lazy[id]);
        minimize(t[id * 2 + 1],lazy[id]);
        minimize(lazy[id * 2],lazy[id]);
        minimize(lazy[id * 2 + 1],lazy[id]);
    }
    void update(int id,int l,int r,int u,int v,int val){
        if (r < u || l > v) return;
        if (u <= l && r <= v){
            minimize(t[id],val);
            minimize(lazy[id],val);
            push(id,l,r);
            return;
        }
        push(id,l,r);
        int mid = (l + r) >> 1;
        update(id*2,l,mid,u,v,val);
        update(id*2+1,mid+1,r,u,v,val);
        t[id] = min(t[id * 2],t[id * 2 + 1]);
    }
    int get(int id,int l,int r,int pos){
        if (r < pos || l > pos) return INF;
        if (l == r) return t[id];
        int mid = (l + r) >> 1;
        push(id,l,r);
        return min(get(id*2,l,mid,pos),get(id*2+1,mid+1,r,pos));
    }
};
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    #define name "main"
    if (fopen(name".inp","r")){
        freopen(name".inp","r",stdin);
        freopen(name".out","w",stdout);
    }
    cin >> n;
    SMT tree(n);
    mid = (n + 1) >> 1;
    for (int i = 1; i <= n; i++){
        cin >> pre[i];
        pre[i] += pre[i - 1];
    }
    for (int i = 1; i <= n; i++){
        cur = 0;
        if (i < mid){
            int right = n - mid + i + 1;
            cur = pre[i] + pre[n] - pre[right - 1];
            tree.update(1,1,n,1,i,cur);
            tree.update(1,1,n,right,n,cur);
        } else{
            cur = pre[i] - pre[i - mid];
            tree.update(1,1,n,i - mid + 1,i,cur);
        }
    }
    for (int i = 1; i <= n; i++){
        maximize(ans,tree.get(1,1,n,i));
    }
    cout << ans;

    return 0;
}

Compilation message (stderr)

hac.cpp: In function 'int main()':
hac.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |         freopen(name".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
hac.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |         freopen(name".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...