Submission #1362237

#TimeUsernameProblemLanguageResultExecution timeMemory
1362237viduxHoliday (IOI14_holiday)C++17
24 / 100
5088 ms11980 KiB
#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

long long int findMaxAttraction(int n, int start, int d, int a[]) {
	auto calc = [&](vector<ll> &v) -> pair<vector<ll>, vector<ll>> {
		vector<ll> r(d+1), r2(d+1), pr(d+1, -1e18);
		pr[0] = 0;
		for (int i = 0; i < v.size(); i++) {
			vector<ll> cur(d+1, -1e18);
			for (int p = 0; p < d; p++) if (pr[p] != -1e18) {
				cur[p+1] = max(cur[p+1], pr[p]);
				r[p+1] = max(r[p+1], cur[p+1]);
				if (p+1+i+1 <= d) r2[p+1+i+1] = max(r2[p+1+i+1], r[p+1]);
				if (p+2 <= d) {
					cur[p+2] = max(cur[p+2], pr[p]+v[i]);
					r[p+2] = max(r[p+2], cur[p+2]);
				}
				if (p+2+i+1 <= d) r2[p+2+i+1] = max(r2[p+2+i+1], r[p+2]);
			}
			swap(cur, pr);
		}
		for (int i = 1; i < d+1; i++) r[i] = max(r[i], r[i-1]);
		for (int i = 1; i < d+1; i++) r2[i] = max(r2[i], r2[i-1]);
		return pair<vector<ll>, vector<ll>>{r, r2};
	};
	vector<ll> lcost, lcost2;
	{
		vector<ll> v;
		for (int i = start-1; i >= 0; i--) v.push_back(a[i]);
		auto [lc, lc2] = calc(v);
		lcost = lc, lcost2 = lc2;
	}
	vector<ll> rcost, rcost2;
	{
		vector<ll> v;
		for (int i = start+1; i < n; i++) v.push_back(a[i]);
		auto [rc, rc2] = calc(v);
		rcost = rc, rcost2 = rc2;
	}
	//cout << "lcost : "; for (ll x : lcost ) cout << x << " "; cout << endl;
	//cout << "lcost2: "; for (ll x : lcost2) cout << x << " "; cout << endl;
	//cout << "rcost : "; for (ll x : rcost ) cout << x << " "; cout << endl;
	//cout << "rcost2: "; for (ll x : rcost2) cout << x << " "; cout << endl;
	ll ans = 0;
	for (int l = 0; l < d+1; l++) for (int take = 0; take < 2; take++) {
		int r = d-l-take;
		if (r < 0) continue;
		ans = max({ans, take*a[start]+lcost[l]+rcost2[r], take*a[start]+lcost2[l]+rcost[r]});
		//cout << l << " " << r << " take start " << take << endl;
		//cout << take*a[start]<<" + "<<lcost[l]<<" + "<<rcost2[r] << endl;
		//cout << take*a[start]<<" + "<<lcost2[l]<<" + "<<rcost[r] << endl;
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...