Submission #1352873

#TimeUsernameProblemLanguageResultExecution timeMemory
1352873mwenCandies (JOI18_candies)C++20
100 / 100
244 ms10988 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<ll> v(n);
    for(int i = 0; i < n; i++)
        cin >> v[i];
        
    auto merge = [](const vector<ll>& a, const vector<ll>& b) {
        vector<ll> res{a[0]+b[0]};
        int ai = 0, bi = 0;
        while(ai+1 < sz(a) && bi+1 < sz(b)) {
            if(a[ai+1]+b[bi] >= a[ai]+b[bi+1]) {
                res.push_back(a[ai+1]+b[bi]);
                ai++;
            }
            else {
                res.push_back(a[ai]+b[bi+1]);
                bi++;
            }
        }
        while(ai+1 < sz(a)) {
            res.push_back(a[ai+1]+b[bi]);
            ai++;
        }
        while(bi+1 < sz(b)) {
            res.push_back(a[ai]+b[bi+1]);
            bi++;
        }
        return res;
    };
    
    auto update = [](vector<ll>& a, const vector<ll>& b) {
        for(int i = 0; i < sz(b); i++) {
            if(i < sz(a))
                a[i] = max(a[i], b[i]);
            else
                a.push_back(b[i]);
        }
    };
    
    function<vector<vector<ll>>(int, int)> solve = [&](int l, int r) {
        if(l == r) {
            return vector{vector<ll>{0}, vector<ll>{0}, vector<ll>{0}, vector<ll>{0, v[l]}};
        }
        int m = (l+r)/2;
        auto left = solve(l, m);
        auto right = solve(m+1, r);
        vector<vector<ll>> res(4, vector<ll>());
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                if((i&1) && (j&2))
                    continue;
                int newMask = (i&2)+(j&1);
                
                update(res[newMask], merge(left[i], right[j]));
            }
        } 
        return res;
    };
    
    auto res = solve(0, n-1);
    vector<ll> ans;
    for(int i = 0; i < 4; i++)
        update(ans, res[i]);
    
    for(int i = 1; i <= (n+1)/2; i++)
        cout << ans[i] << "\n";
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...