이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |