제출 #1346334

#제출 시각아이디문제언어결과실행 시간메모리
1346334anteknneCandies (JOI18_candies)C++20
100 / 100
326 ms12196 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;

#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false

const int MAXN = 200 * 1000 + 17;
const ll INF = ll(-1000 * 1000 * 1000) * ll(1000 * 1000 * 1000);
ll a[MAXN];

vector<ll> lacz (vector<ll> v1, vector<ll> v2) {
    int n1 = int(v1.size());
    int n2 = int(v2.size());
    vector<ll> v = {};

    int i1 = 0, i2 = 0;
    for (int i = 0; i < n1 + n2; i ++) {
        if (i1 == n1) {
            v.pb(v2[i2]);
            i2 ++;
            continue;
        }
        if (i2 == n2) {
            v.pb(v1[i1]);
            i1 ++;
            continue;
        }
        if (v1[i1] > v2[i2]) {
            v.pb(v1[i1]);
            i1 ++;
        } else {
            v.pb(v2[i2]);
            i2 ++;
        }
    }
    return v;
}

int koduj (int x, int y) {
    return (x * 2 + y);
}

vector<vector<ll>> dziel (int P, int K) {
    if (P == K) {
        return {{INF}, {INF}, {INF}, {a[P]}};
    }
    int sr = (P + K)/ 2;
    vector<vector<ll>> l = dziel(P, sr);
    vector<vector<ll>> r = dziel(sr + 1, K);

    vector<vector<ll>> wyn = {};
    int n = (K - P + 2)/ 2;
    for (int i = 0; i < 4; i ++) {
        wyn.pb({});
        for (int j = 0; j < n; j ++) {
            wyn.back().pb(INF);
        }
    }

    for (int i = 0; i < 2; i ++) {
        for (int j = 0; j < 2; j ++) {
            ll s1 = 0, s2 = 0;
            ll poprz = 0;
            for (int k = 0; k < int(l[koduj(i, j)].size()); k ++) {
                s1 += wyn[koduj(i, 0)][k];
                s2 += l[koduj(i, j)][k];
                s1 = max(s1, INF);
                s2 = max(s2, INF);
                ll s = max(s1, s2);
                if (s > 0) {
                    wyn[koduj(i, 0)][k] = s - poprz;
                }
                poprz = s;
            }
        }
    }
    for (int i = 0; i < 2; i ++) {
        for (int j = 0; j < 2; j ++) {
            ll s1 = 0, s2 = 0;
            ll poprz = 0;
            for (int k = 0; k < int(r[koduj(i, j)].size()); k ++) {
                s1 += wyn[koduj(0, j)][k];
                s2 += r[koduj(i, j)][k];
                s1 = max(s1, INF);
                s2 = max(s2, INF);
                ll s = max(s1, s2);
                if (s > 0) {
                    wyn[koduj(0, j)][k] = s - poprz;
                }
                poprz = s;
            }
        }
    }


    for (int i = 0; i < 2; i ++) {
        for (int j = 0; j < 2; j ++) {
            for (int k = 0; k < 2; k ++) {
                if (j == 1 && k == 1) {
                    continue;
                }
                for (int m = 0; m < 2; m ++) {
                    vector<ll> akt = lacz(l[koduj(i, j)], r[koduj(k, m)]);
                    ll s1 = 0, s2 = 0;
                    ll poprz = 0;
                    for (int ii = 0; ii < min(n, int(akt.size())); ii ++) {
                        s1 += wyn[koduj(i, m)][ii];
                        s2 += akt[ii];
                        s1 = max(s1, INF);
                        s2 = max(s2, INF);
                        ll s = max(s1, s2);
                        if (s > 0) {
                            wyn[koduj(i, m)][ii] = s - poprz;
                        }
                        poprz = s;
                    }
                }
            }
        }
    }

    /*cout << P << " " << K << "\n";


    for (int i = 0; i < 4; i ++) {
        for (auto x : l[i]) {
            cout << x << " ";
        }
        cout << "\n";
    }

    cout << "\n";

    for (int i = 0; i < 4; i ++) {
        for (auto x : r[i]) {
            cout << x << " ";
        }
        cout << "\n";
    }

    cout << "\n";


    for (int i = 0; i < 4; i ++) {
        for (auto x : wyn[i]) {
            cout << x << " ";
        }
        cout << "\n";
    }

    cout << "\n";*/

    return wyn;
}

int main () {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n;
    cin >> n;

    for (int i = 0; i < n; i ++) {
        cin >> a[i];
    }

    vector<vector<ll>> wyn = dziel(0, n - 1);

    ll s = 0;
    for (int i = 0; i < (n + 1)/ 2; i ++) {
        s +=  max({wyn[0][i], wyn[1][i], wyn[2][i], wyn[3][i]});
        cout << s << "\n";
    }

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