Submission #1127474

#TimeUsernameProblemLanguageResultExecution timeMemory
1127474DylanSmithCandies (JOI18_candies)C++17
100 / 100
605 ms15532 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define pb push_back
#define sz(x) (int)x.size()
#define all(x) begin(x),end(x)
#define lb(x,y) lower_bound(all(x),y)-begin(x)

mt19937 rng;

vector<ll> merge(vector<ll> a, vector<ll> b) {
	if (a.empty() || b.empty()) return {};
	int i = 1, j = 1;
	vector<ll> res = {a[0] + b[0]};
	while (i < sz(a) || j < sz(b)) {
		if (j == sz(b) || i < sz(a) && a[i] - a[i - 1] > b[j] - b[j - 1]) {
			res.pb(a[i] - a[i - 1] + res[sz(res) - 1]);
			i++;
		} else {
			res.pb(b[j] - b[j - 1] + res[sz(res) - 1]);
			j++;
		}
	}
	return res;
}

vector<ll> vMax(vector<ll> a, vector<ll> b) {
	for (int i = 0; i < sz(b); i++) {
		if (sz(a) == i) a.pb(LLONG_MIN);
		a[i] = max(a[i], b[i]);
	}
	return a;
}

vector<vector<vector<ll>>> search(vector<int> a) {
	if (sz(a) == 1) {
		vector res(2, vector<vector<ll>>(2, {0}));
		res[0][0].pb(a[0]);
		return res;
	}
	int mid = sz(a) / 2;
	vector<int> aL, aR;
	for (int i = 0; i < mid; i++) aL.pb(a[i]);
	for (int i = mid; i < sz(a); i++) aR.pb(a[i]);
	auto left = search(aL), right = search(aR);
	vector res(2, vector<vector<ll>>(2));
	for (int l = 0; l < 2; l++) {
		for (int r = 0; r < 2; r++) {
			res[l][r] = vMax(res[l][r], merge(left[l][0], right[1][r]));
			res[l][r] = vMax(res[l][r], merge(left[l][1], right[0][r]));
			res[0][0] = vMax(res[0][0], res[l][r]);
		}
	}
	vector<vector<vector<ll>>>().swap(left);
	vector<vector<vector<ll>>>().swap(right);
	return res;
}

void solve() {
	int N; cin >> N;
	vector<int> a(N);
	for (int i = 0; i < N; i++) cin >> a[i];
	auto res = search(a);
	for (int i = 1; i < sz(res[0][0]); i++) {
		cout << res[0][0][i] << "\n";
	}
}

int main() {
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
    rng = mt19937(chrono::steady_clock::now().time_since_epoch().count());

    solve();

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