제출 #680696

#제출 시각아이디문제언어결과실행 시간메모리
680696etheningCollecting Stamps 3 (JOI20_ho_t3)C++17
100 / 100
1443 ms135256 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

ll dp[205][205][205][2];

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n;
	ll l;
	cin >> n >> l;
	vector<ll> X(n + 2, 0);
	vector<ll> T(n + 2, 0);
	X[0] = 0;
	for (int i = 1; i <= n; i++) {
		cin >> X[i];
	}
	X[n + 1] = l;
	for (int i = 1; i <= n; i++) {
		cin >> T[i];
	}
	memset(dp, -1, sizeof(dp));

	int ans = 0;

	dp[0][0][0][0] = 0;
	dp[0][0][0][1] = 0;
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= n; j++) {
			if (i == 0 && j == 0) continue;
			if (i + j > n) continue;
			for (int k = 1; k <= n; k++) {
				if (k > i + j) break;
				for (int lst = i - 1; lst >= 0; lst--) {
					if (k - 1 > lst + j) break;
					// cout << "@@@ " << i << " " << j << " " << k << " " << 0 << " <- " << lst << " " << j << " " << k - 1 << " " << 0 << endl;
					if (dp[lst][j][k - 1][0] != -1) {
						ll dst = abs(X[i] - X[lst]);
						dst = min(dst, l - dst);
						ll tme = dp[lst][j][k - 1][0] + dst;
						if (tme <= T[i]) {
							if (dp[i][j][k][0] == -1) dp[i][j][k][0] = tme;
							dp[i][j][k][0] = min(dp[i][j][k][0], tme);
							ans = max(ans, k);
						}
					}
					if (dp[lst][j][k - 1][1] != -1) {
						ll dst = abs(X[i] - X[n + 1 - j]);
						dst = min(dst, l - dst);
						ll tme = dp[lst][j][k - 1][1] + dst;
						if (tme <= T[i]) {
							if (dp[i][j][k][0] == -1) dp[i][j][k][0] = tme;
							dp[i][j][k][0] = min(dp[i][j][k][0], tme);
							ans = max(ans, k);
						}
					}
				}
				for (int lst = j - 1; lst >= 0; lst--) {
					if (k - 1 > lst + i) break;
					if (dp[i][lst][k - 1][1] != -1) {
						ll dst = abs(X[n + 1 - j] - X[n + 1 - lst]);
						dst = min(dst, l - dst);
						ll tme = dp[i][lst][k - 1][1] + dst;
						if (tme <= T[n + 1 - j]) {
							if (dp[i][j][k][1] == -1) dp[i][j][k][1] = tme;
							dp[i][j][k][1] = min(dp[i][j][k][1], tme);
							ans = max(ans, k);
						}
					}
					if (dp[i][lst][k - 1][0] != -1) {
						ll dst = abs(X[n + 1 - j] - X[i]);
						dst = min(dst, l - dst);
						ll tme = dp[i][lst][k - 1][0] + dst;
						if (tme <= T[n + 1 - j]) {
							if (dp[i][j][k][1] == -1) dp[i][j][k][1] = tme;
							dp[i][j][k][1] = min(dp[i][j][k][1], tme);
							ans = max(ans, k);
						}
					}
				}
			}
		}
	}

	// for (int i = 0; i <= n; i++) {
	// 	for (int j = 0; j <= n; j++) {
	// 		for (int k = 0; k <= n; k++) {
	// 			for (int l = 0; l <= 1; l++) {
	// 				cout << i << " " << j << " " << k << " " << l << "   :" << dp[i][j][k][l] << endl;
	// 			}
	// 		}
	// 	}
	// }
	cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...