Submission #1353531

#TimeUsernameProblemLanguageResultExecution timeMemory
1353531po_rag526Candies (JOI18_candies)C++20
100 / 100
202 ms9700 KiB
// dmoj problem: https://vjudge.net/contest/805148#problem/B
#include <bits/stdc++.h>
#define int long long
#define all(x) x.begin(), x.end()
using namespace std;

int n, a[200001];
void tryinsert(int idx, int ins, vector<int> &to)
{
    if (idx < to.size())
    {
        to[idx] = max(to[idx], ins);
    }
    else
    {
        assert(idx == to.size());
        to.push_back(ins);
    }
}
void join(vector<int> &a, vector<int> &b, vector<int> &out)
{
    int lp = 0;
    int rp = 0;
    int cur = 0;
    while (lp + 1 < a.size() && rp + 1 < b.size())
    {
        if (a[lp + 1] + b[rp] > a[lp] + b[rp + 1])
        {
            tryinsert(lp + rp + 1, a[lp + 1] + b[rp], out);
            ++lp;
        }
        else
        {
            tryinsert(lp + rp + 1, a[lp] + b[rp + 1], out);
            ++rp;
        }
    }
    while (lp + 1 < a.size())
    {
        tryinsert(lp + rp + 1, a[lp + 1] + b[rp], out);
        ++lp;
    }
    while (rp + 1 < b.size())
    {
        tryinsert(lp + rp + 1, a[lp] + b[rp + 1], out);
        ++rp;
    }
}
// _ _! !_ !!
// 00
vector<vector<int>> recurse(int l, int r)
{
    if (l == r)
        return {{0}, {0}, {0}, {0, a[l]}};
    int m = (l + r) / 2;
    auto a = recurse(l, m);
    auto b = recurse(m + 1, r);
    vector<vector<int>> out(4, vector<int>(1));
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if ((i & 1) && (j & 2))
                continue;
            join(a[i], b[j], out[(i & 2) + (j & 1)]);
        }
    }
    return out;
}
int32_t main()
{
    cin.sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    auto ret = recurse(1, n);
    vector<int> out(1);
    vector<int> t(1);
    for (int i = 0; i < 4; i++)
    {
        join(ret[i], t, out);
    }
    for (int i = 1; i <= (n + 1) / 2; i++)
        cout << out[i] << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...