Submission #1184534

#TimeUsernameProblemLanguageResultExecution timeMemory
1184534jerzykCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
160 ms130868 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define st first #define nd second typedef long long ll; typedef long double ld; const ll I = 10'000'000'000'000'000LL; const int II = 2'000'000'000; const ll M = 1000'000'007LL; const int N = 207; ll dis[N], m; int n; ll tab[N]; ll dp[N][N][N][2]; ll D(int a, int b) { if(a > b) swap(a, b); return min(dis[b] - dis[a], m - (dis[b] - dis[a])); } ll Licz(int r, int a, int b, int x) { int a1, b1; ll ans = I; a1 = a + 1; b1 = b - 1; if(a1 > n) a1 = 1; if(b1 < 1) b1 = n; if(r == 0) { //if(a == 4 && b == 5) //{ //cout << a << " " << b << " " << a1 << " " << b1 << "\n"; //} ans = dp[a1][b][x][0] + D(a, a1); ans = min(ans, dp[a1][b][x][1] + D(a, b)); return ans; } ans = dp[a][b1][x][0] + D(a, b); ans = min(ans, dp[a][b1][x][1] + D(b1, b)); return ans; } void Solve() { cin >> n >> m; for(int i = 1; i <= n; ++i) cin >> dis[i]; for(int i = 1; i <= n; ++i) cin >> tab[i]; for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) for(int k = 0; k <= n; ++k) for(int r = 0; r < 2; ++r) dp[i][j][k][r] = I; dp[1][1][0][0] = min(dis[1], m - dis[1]); dp[n][n][0][0] = min(dis[n], m - dis[n]); if(dp[1][1][0][0] <= tab[1]) dp[1][1][1][0] = dp[1][1][0][0]; if(dp[n][n][0][0] <= tab[n]) dp[n][n][1][0] = dp[n][n][0][0]; dp[1][1][0][1] = dp[1][1][0][0]; dp[1][1][1][1] = dp[1][1][1][0]; dp[n][n][0][1] = dp[n][n][0][0]; dp[n][n][1][1] = dp[n][n][1][0]; int answer = 0; if(dp[1][1][1][0] < I || dp[n][n][1][0] < I) answer = 1; //cout << dp[n][n][0][0] << "\n"; for(int d = 2; d <= n; ++d) { for(int i = 1; i <= n; ++i) { int j = i + d - 1; if(j > n) j -= n; for(int l = 0; l <= n; ++l) { dp[i][j][l][0] = Licz(0, i, j, l); dp[i][j][l][1] = Licz(1, i, j, l); } for(int l = n - 1; l >= 0; --l) { if(dp[i][j][l][0] <= tab[i]) dp[i][j][l + 1][0] = min(dp[i][j][l + 1][0], dp[i][j][l][0]); if(dp[i][j][l][1] <= tab[j]) dp[i][j][l + 1][1] = min(dp[i][j][l + 1][1], dp[i][j][l][1]); } for(int l = 0; l <= n; ++l) for(int r = 0; r < 2; ++r) { dp[i][j][l][r] = min(dp[i][j][l][r], I); if(dp[i][j][l][r] < I) { // cout << "DP: " << i << " " << j << " " << l << " " << r << " " << dp[i][j][l][r] << "\n"; answer = max(answer, l); } } } } cout << answer << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //int t; cin >> t; //while(t--) Solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...