제출 #968717

#제출 시각아이디문제언어결과실행 시간메모리
968717raphaelpCollecting Stamps 3 (JOI20_ho_t3)C++14
100 / 100
497 ms446960 KiB
#include <bits/stdc++.h> using namespace std; int main() { long long N, L; cin >> N >> L; vector<pair<long long, long long>> Tab(N); for (long long i = 0; i < N; i++) cin >> Tab[i].first; for (long long i = 0; i < N; i++) cin >> Tab[i].second; sort(Tab.begin(), Tab.end()); vector<vector<vector<vector<long long>>>> dp(N, vector<vector<vector<long long>>>(N, vector<vector<long long>>(N + 2, vector<long long>(2, 12345678900000000)))); long long maxx = 0; dp[0][0][(Tab[0].first <= Tab[0].second) ? 1 : 0][0] = Tab[0].first; dp[N - 1][N - 1][(L - Tab[N - 1].first <= Tab[N - 1].second) ? 1 : 0][1] = L - Tab[N - 1].first; for (long long i = 0; i < N; i++) { for (long long left = 0; left < N; left++) { long long right = (left + N - i) % N; for (long long nb = 0; nb <= N; nb++) { if (nb > i + 1) continue; if (min(dp[left][right][nb][0], dp[left][right][nb][1]) == 12345678900000000) continue; maxx = max(maxx, nb); long long next = (left + 1) % N, dist = (Tab[left].first < Tab[next].first) ? Tab[next].first - Tab[left].first : Tab[next].first + L - Tab[left].first; dp[next][right][(dp[left][right][nb][0] + dist > Tab[next].second) ? nb : nb + 1][0] = min(dp[left][right][nb][0] + dist, dp[next][right][(dp[left][right][nb][0] + dist > Tab[next].second) ? nb : nb + 1][0]); next = (left + 1) % N, dist = (Tab[right].first < Tab[next].first) ? Tab[next].first - Tab[right].first : Tab[next].first + L - Tab[right].first; dp[next][right][(dp[left][right][nb][1] + dist > Tab[next].second) ? nb : nb + 1][0] = min(dp[left][right][nb][1] + dist, dp[next][right][(dp[left][right][nb][1] + dist > Tab[next].second) ? nb : nb + 1][0]); next = (right - 1 + N) % N, dist = (Tab[right].first > Tab[next].first) ? Tab[right].first - Tab[next].first : Tab[right].first + L - Tab[next].first; dp[left][next][(dp[left][right][nb][1] + dist > Tab[next].second) ? nb : nb + 1][1] = min(dp[left][right][nb][1] + dist, dp[left][next][(dp[left][right][nb][1] + dist > Tab[next].second) ? nb : nb + 1][1]); next = (right - 1 + N) % N, dist = (Tab[left].first > Tab[next].first) ? Tab[left].first - Tab[next].first : Tab[left].first + L - Tab[next].first; dp[left][next][(dp[left][right][nb][0] + dist > Tab[next].second) ? nb : nb + 1][1] = min(dp[left][right][nb][0] + dist, dp[left][next][(dp[left][right][nb][0] + dist > Tab[next].second) ? nb : nb + 1][1]); } } } cout << maxx; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...