Submission #680696

#TimeUsernameProblemLanguageResultExecution timeMemory
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...