Submission #1251741

#TimeUsernameProblemLanguageResultExecution timeMemory
1251741Zicrus축제 (IOI25_festival)C++20
27 / 100
1133 ms2162688 KiB
#include <bits/stdc++.h>
#include "festival.h"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define all(v) v.begin(), v.end()
constexpr ll inf = 1ll << 62ll;
mt19937 mt(34056237);
ll _ = 0;

vector<int> max_coupons(int A, vector<int> price, vector<int> type) {
	ll n = price.size();
	vector<vector<pll>> coups(4+1);
	for (ll i = 0; i < n; i++) {
		coups[type[i]].emplace_back(price[i], i);
	}
	for (ll i = 1; i <= 4; i++) sort(all(coups[i]));

	vector<vector<vector<vector<ll>>>> dp(coups[1].size()+1, vector<vector<vector<ll>>>(coups[2].size()+1, vector<vector<ll>>(coups[3].size()+1, vector<ll>(coups[4].size()+1))));
	vector<vector<vector<vector<short>>>> buy(coups[1].size()+1, vector<vector<vector<short>>>(coups[2].size()+1, vector<vector<short>>(coups[3].size()+1, vector<short>(coups[4].size()+1))));
	dp[0][0][0][0] = A;
	auto get_dp = [&](ll i1, ll i2, ll i3, ll i4) -> ll {
		if (min({i1, i2, i3, i4}) < 0) return -1;
		if (dp[i1][i2][i3][i4] < 0) return -1;
		if (dp[i1][i2][i3][i4] > 1e18) return 1e18;
		return dp[i1][i2][i3][i4];
	};
	ll b1 = 0, b2 = 0, b3 = 0, b4 = 0;
	for (ll i1 = 0; i1 <= coups[1].size(); i1++) {
		for (ll i2 = 0; i2 <= coups[2].size(); i2++) {
			for (ll i3 = 0; i3 <= coups[3].size(); i3++) {
				for (ll i4 = 0; i4 <= coups[4].size(); i4++) {
					if (max({i1, i2, i3, i4}) == 0) continue;
					ll r1 = -1;
					if (i1 > 0) r1 = (get_dp(i1-1, i2, i3, i4) - coups[1][i1-1].first) * 1;
					ll r2 = -1;
					if (i2 > 0) r2 = (get_dp(i1, i2-1, i3, i4) - coups[2][i2-1].first) * 2;
					ll r3 = -1;
					if (i3 > 0) r3 = (get_dp(i1, i2, i3-1, i4) - coups[3][i3-1].first) * 3;
					ll r4 = -1;
					if (i4 > 0) r4 = (get_dp(i1, i2, i3, i4-1) - coups[4][i4-1].first) * 4;
					ll mx = max({r1, r2, r3, r4});
					if (r1 == mx) buy[i1][i2][i3][i4] = 1;
					if (r2 == mx) buy[i1][i2][i3][i4] = 2;
					if (r3 == mx) buy[i1][i2][i3][i4] = 3;
					if (r4 == mx) buy[i1][i2][i3][i4] = 4;
					dp[i1][i2][i3][i4] = max({r1, r2, r3, r4});
					dp[i1][i2][i3][i4] = get_dp(i1, i2, i3, i4);
					if (dp[i1][i2][i3][i4] < 0) continue;
					if (i1 + i2 + i3 + i4 > b1 + b2 + b3 + b4) {
						b1 = i1; b2 = i2; b3 = i3; b4 = i4;
					}
				}
			}
		}
	}
	vector<int> res;
	while (b1 + b2 + b3 + b4 > 0) {
		short nxt = buy[b1][b2][b3][b4];
		ll id = 0;
		if (nxt == 1) id = b1--;
		if (nxt == 2) id = b2--;
		if (nxt == 3) id = b3--;
		if (nxt == 4) id = b4--;
		res.push_back(coups[nxt][id-1].second);
	}
	reverse(all(res));
	return res;
}

#ifdef TEST
#include "grader.cpp"
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...