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