Submission #1310246

#TimeUsernameProblemLanguageResultExecution timeMemory
1310246mat_jurCandies (JOI18_candies)C++20
100 / 100
381 ms13284 KiB
#include "bits/stdc++.h"
using namespace std;
#ifdef DEBUG
auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";}
#define debug(X) cerr << "["#X"]: " << X << '\n';
#else 
#define cerr if(0)cout
#define debug(X) ;
#endif
using ll = long long;
#define all(v) (v).begin(), (v).end()
#define ssize(x) int(x.size())
#define fi first
#define se second
#define mp make_pair
#define eb emplace_back

struct DP {
	vector<ll> t[2][2];

	DP() {
		t[0][0] = t[0][1] = t[1][0] = t[1][1] = vector<ll>{0LL};
	}
};

vector<ll> max(vector<ll> a, const vector<ll> &b) {
	for (int i = 0; i < ssize(b); ++i) {
		if (i >= ssize(a)) a.eb(0);
		a[i] = max(a[i], b[i]);
	}
	return a;
}

vector<ll> comb(const vector<ll> &a, const vector<ll> &b) {
	vector<ll> res;

	int i = 0, j = 0;
	while (i < ssize(a) && j < ssize(b)) {
		res.eb(a[i] + b[j]);
		if (i == ssize(a) - 1)
			++j;
		else if (j == ssize(b) - 1)
			++i;
		else if (a[i+1] - a[i] > b[j+1] - b[j]) 
			++i;
		else 
			++j;
	}

	return res;
}

DP comb(const DP &a, const DP &b) {
	DP ret;
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 2; ++j) {
			ret.t[i][j] = max(ret.t[i][j], comb(a.t[i][0], b.t[0][j]));
			ret.t[i][j] = max(ret.t[i][j], comb(a.t[i][0], b.t[1][j]));
			ret.t[i][j] = max(ret.t[i][j], comb(a.t[i][1], b.t[0][j]));
		}
	}

	return ret;
}

DP solve(int l, int r, const vector<int> &a) {
	if (l == r) {
		DP res;
		res.t[1][1].eb(a[l]);
		return res;
	}

	int mid = (l + r) / 2;

	DP dp_l = solve(l, mid, a), dp_r = solve(mid+1, r, a);

	return comb(dp_l, dp_r);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr);

	int n;
	cin >> n;
	vector<int> a(n);
	for (int &x : a) cin >> x;

	DP dp = solve(0, n-1, a);

	for (int i = 1; i <= (n+1)/2; ++i) {
		ll res = 0;
		if (i < ssize(dp.t[0][0])) res = max(res, dp.t[0][0][i]);
		if (i < ssize(dp.t[0][1])) res = max(res, dp.t[0][1][i]);
		if (i < ssize(dp.t[1][0])) res = max(res, dp.t[1][0][i]);
		if (i < ssize(dp.t[1][1])) res = max(res, dp.t[1][1][i]);
		cout << res << '\n';
	}

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