Submission #414477

#TimeUsernameProblemLanguageResultExecution timeMemory
414477CrouchingDragonHacker (BOI15_hac)C++17
100 / 100
78 ms6876 KiB
#include "bits/stdc++.h" using namespace std; #define endl '\n' #define debug(x) cerr << #x << " == " << (x) << '\n'; #define all(x) begin(x), end(x) using ll = long long; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3fLL; template<typename T> struct M1 { using Type = T; inline const static T Id = numeric_limits<T>::min(); static T op(const T& x, const T& y) { return max(x, y); } }; template<typename Monoid, bool top_down> struct MinimumStack { using M = Monoid; using T = typename M::Type; stack<pair<T, T>> st; T top() const { return st.top().first; } T minimum() const { return st.empty() ? M::Id : st.top().second; } void push(T value) { st.emplace(value, top_down ? M::op(value, minimum()) : M::op(minimum(), value)); } void pop() { st.pop(); } bool empty() const { return st.empty(); } size_t size() const { return size(st); } }; template<typename Monoid> struct MinimumQueue { using M = Monoid; using T = typename Monoid::Type; MinimumStack<Monoid, false> in; MinimumStack<Monoid, true> out; void move() { if (out.empty()) while (not in.empty()) { out.push(in.top()); in.pop(); } } T front() { move(); return out.top(); } T minimum() const { return M::op(out.minimum(), in.minimum()); } void push(T value) { in.push(value); } void pop() { move(); out.pop(); } bool empty() const { return in.empty() && out.empty(); } size_t size() const { return size(in) + size(out); } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<int> v(n); for (auto& x : v) cin >> x; MinimumQueue<M1<int>> mq; int sum = 0, cnt = n / 2; for (int i = 1; i < 1 + cnt; ++i) { sum += v[i]; } mq.push(sum); for (int i = 1 + cnt; i < n; ++i) { sum += v[i] - v[i - cnt]; mq.push(sum); } int opt = INF; for (int i = 0; i < n; ++i) { opt = min(opt, mq.minimum()); mq.pop(); sum += v[i] - v[(i + n - cnt) % n]; mq.push(sum); } int ans = accumulate(all(v), 0) - opt; cout << ans << endl; exit(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...