Submission #1239006

#TimeUsernameProblemLanguageResultExecution timeMemory
1239006trimkusCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
79 ms133960 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 205; ll dp[MAXN + 1][MAXN + 1][MAXN + 1][2]; void chmin(ll& x, ll y) { x = min(x, y); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; ll Lt; cin >> N >> Lt; vector<ll> x(N + 3); for (int i = 1; i <= N; ++i) { cin >> x[i]; } x[0] = 0; x[N + 1] = Lt; vector<ll> t(N + 3, -1); for (int i = 1; i <= N; ++i) { cin >> t[i]; } const ll INF = 1e18; t[0] = -INF; t[N + 1] = -INF; for (int i = 0; i <= N + 2; ++i) { for (int j = 0; j <= N + 2; ++j) { for (int k = 0; k <= N + 2; ++k) { for (int l = 0; l < 2; ++l) { dp[i][j][k][l] = INF; } } } } dp[0][N + 1][0][0] = dp[0][N + 1][0][1] = 0; auto dist = [&](ll X, ll Y) -> ll { // if (min(abs(X - Y), Lt - abs(X - Y)) == 0) { // cout << X << " " << Y << "\n"; // } // assert(min(abs(X - Y), Lt - abs(X - Y)) > 0); return min(abs(X - Y), Lt - abs(X - Y)); }; for (int l = 0; l < N; ++l) { for (int r = N + 1; r - 1 > l; --r) { for (int k = 0; k <= N; ++k) { ll tim = min(dp[l][r][k][0] + dist(x[l + 1], x[l]), dp[l][r][k][1] + dist(x[l + 1], x[r])); if (tim <= t[l + 1]) { chmin(dp[l + 1][r][k + 1][0], tim); } else { chmin(dp[l + 1][r][k][0], tim); } tim = min(dp[l][r][k][0] + dist(x[l], x[r - 1]), dp[l][r][k][1] + dist(x[r], x[r - 1])); if (tim <= t[r - 1]) { chmin(dp[l][r - 1][k + 1][1], tim); } else { chmin(dp[l][r - 1][k][1], tim); } } } } int res = 0; for (int i = 0; i <= N + 1; ++i) { for (int j = 0; j <= N + 1; ++j) { for (int k = 0; k <= N; ++k) { for (int z = 0; z < 2; ++z) { if (dp[i][j][k][z] >= INF) continue; res = max(res, k); } } } } cout << res << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...