# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1265055 | baotoan655 | Collecting Stamps 3 (JOI20_ho_t3) | C++20 | 84 ms | 131656 KiB |
#include <bits/stdc++.h>
#define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
using namespace std;
const int N = 205;
const long long INF = 4e18;
int n;
long long L;
long long X[N], Tm[N];
long long rightd[N], leftd[N];
int idxR[N], idxL[N];
long long dpL[N][N][N];
long long dpR[N][N][N];
long long distLR(long long aL, long long bR) {
long long s = aL + bR;
return min(s, L - s);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
file("A") else file("task");
cin >> n >> L;
for (int i = 1; i <= n; ++i) cin >> X[i];
for (int i = 1; i <= n; ++i) cin >> Tm[i];
rightd[0] = 0;
for (int j = 1; j <= n; ++j) {
rightd[j] = X[j];
idxR[j] = j;
}
leftd[0] = 0;
for (int i = 1; i <= n; ++i) {
leftd[i] = L - X[n - i + 1];
idxL[i] = n - i + 1;
}
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= n; ++j) {
for (int k = 0; k <= n; ++k) {
dpL[i][j][k] = dpR[i][j][k] = INF;
}
}
}
dpL[0][0][0] = dpR[0][0][0] = 0;
for (int i = 0; i <= n; ++i) {
for (int j = 0; j + i <= n; ++j) {
int visited = i + j;
for (int k = 0; k <= visited; ++k) {
long long cur = dpL[i][j][k];
if (cur < INF && visited < n) {
long long arrive = cur + (leftd[i + 1] - leftd[i]);
int id = idxL[i + 1];
int nk = k + (arrive <= Tm[id] ? 1 : 0);
if (dpL[i + 1][j][nk] > arrive) dpL[i + 1][j][nk] = arrive;
arrive = cur + distLR(leftd[i], rightd[j + 1]);
id = idxR[j + 1];
nk = k + (arrive <= Tm[id] ? 1 : 0);
if (dpR[i][j + 1][nk] > arrive) dpR[i][j + 1][nk] = arrive;
}
cur = dpR[i][j][k];
if (cur < INF && visited < n) {
long long arrive = cur + (rightd[j + 1] - rightd[j]);
int id = idxR[j + 1];
int nk = k + (arrive <= Tm[id] ? 1 : 0);
if (dpR[i][j + 1][nk] > arrive) dpR[i][j + 1][nk] = arrive;
arrive = cur + distLR(leftd[i + 1], rightd[j]);
id = idxL[i + 1];
nk = k + (arrive <= Tm[id] ? 1 : 0);
if (dpL[i + 1][j][nk] > arrive) dpL[i + 1][j][nk] = arrive;
}
}
}
}
int ans = 0;
for (int i = 0; i <= n; ++i) {
for (int j = 0; j + i <= n; ++j) {
for (int k = 0; k <= n; ++k) {
if (dpL[i][j][k] < INF || dpR[i][j][k] < INF) ans = max(ans, k);
}
}
}
cout << ans << '\n';
}
Compilation message (stderr)
# | 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... |