제출 #1184479

#제출 시각아이디문제언어결과실행 시간메모리
1184479jerzykCollecting Stamps 3 (JOI20_ho_t3)C++20
0 / 100
0 ms392 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[0]) 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...