Submission #1271324

#TimeUsernameProblemLanguageResultExecution timeMemory
1271324model_codeHeat Stroke (JOI24_heat)C++20
100 / 100
466 ms502160 KiB
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solve(int L, int N, const vector<int>& C, const vector<int>& A) {
	// step #1. preparation
	vector<vector<int> > g(L - 1);
	for (int i = 0; i < N; i++) {
		g[A[i]].push_back(i);
	}

	// step #2. dynamic programming
	const int INF = 1012345678;
	vector<vector<int> > dp(1, vector<int>(N + 1, 0));
	for (int i = 0; i <= L - 2; i++) {
		vector<int> s(N + 1);
		for (int j = 0; j < N; j++) {
			if (A[j] == i) {
				s[j + 1]++;
			}
		}
		for (int j = 0; j < N; j++) {
			s[j + 1] += s[j];
		}
		int sn = g[i].size();
		int sp = (i != 0 ? g[i - 1].size() : 0);
		vector<vector<int> > ndp(sn + 1, vector<int>(N + 1, -INF));
		// pattern A: dp[?][y] -> dp[j][k] (0 <= y < k) [d = s[k] - j]
		for (int d = max(C[i] - sp, 0); d <= min(sn, C[i]); d++) {
			int x = C[i] - d;
			int val = -INF;
			for (int j = 0; j <= min(sn - d, C[i + 1]); j++) {
				for (int k = (d + j != 0 ? g[i][d + j - 1] + 1 : 0); k <= (d + j != sn ? g[i][d + j] : N); k++) {
					if (val != -INF) {
						ndp[j][k] = max(ndp[j][k], val + sn - (d + j));
					}
					val = max(val, dp[x][k]);
				}
			}
		}
		// pattern B: dp[?][y] -> dp[j][k] (k <= y < N)
		for (int j = 0; j <= min(sn, C[i + 1]); j++) {
			int val = -INF;
			for (int k = N - 1; k >= (j != 0 ? g[i][j - 1] + 1 : 0); k--) {
				int x = C[i] - (s[k] - j);
				if (0 <= x && x <= sp && dp[x][k] != -INF) {
					val = max(val, dp[x][k] + sn - s[k]);
				}
				ndp[j][k] = max(ndp[j][k], val);
			}
		}
		// pattern C: dp[?][N] -> dp[j][k]
		for (int j = 0; j <= min(sn, C[i + 1]); j++) {
			int val = -INF;
			for (int x = 0; x <= min(sp, C[i] + j - sn); x++) {
				val = max(val, dp[x][N]);
			}
			for (int k = (j != 0 ? g[i][j - 1] + 1 : 0); k <= N; k++) {
				ndp[j][k] = max(ndp[j][k], val);
			}
		}
		dp = ndp;
	}

	// step #3. final
	int ans = -INF;
	for (int i = 0; i <= int(g[L - 2].size()); i++) {
		for (int j = 0; j <= N; j++) {
			if (j != N ? i == C[L - 1] : i <= C[L - 1]) {
				ans = max(ans, dp[i][j]);
			}
		}
	}

	return ans;
}

int main() {
	int L;
	cin >> L;
	vector<int> C(L);
	for (int i = 0; i < L; i++) {
		cin >> C[i];
	}
	int N;
	cin >> N;
	vector<int> A(N);
	for (int i = 0; i < N; i++) {
		cin >> A[i];
		A[i]--;
	}
	int ans = solve(L, N, C, A);
	cout << ans << endl;
	return 0;
}
#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...