Submission #1173561

#TimeUsernameProblemLanguageResultExecution timeMemory
1173561chikien2009Collecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
68 ms63304 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, l, a, b, c[4], x[200], t[200], f[200][200][201][2], res = 0;

int main()
{
    setup();

    cin >> n >> l;
    for (int i = 0; i < n; ++i)
    {
        cin >> x[i];
    }
    for (int i = 0; i < n; ++i)
    {
        cin >> t[i];
    }
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            for (int k = 0; k <= n; ++k)
            {
                for (int h = 0; h < 2; ++h)
                {
                    f[i][j][k][h] = 1e9 + 1;
                }
            }
        }
    }
    for (int d = 0; d < n; ++d)
    {
        for (int i = 0, j; i < n; ++i)
        {
            j = (i + d) % n;
            if (i == j)
            {
                a = min(x[i], l - x[i]);
                f[i][j][0][0] = f[i][j][0][1] = a;
                if (a <= t[i])
                {
                    f[i][j][1][0] = f[i][j][1][1] = a;
                }
                continue;
            }
            for (int k = 0; k <= n; ++k)
            {
                a = (i + 1) % n;
                b = (j - 1 + n) % n;
                c[0] = min(abs(x[i] - x[a]), l - abs(x[i] - x[a]));
                c[1] = min(abs(x[i] - x[j]), l - abs(x[i] - x[j]));
                c[2] = min(abs(x[j] - x[b]), l - abs(x[j] - x[b]));
                f[i][j][k][0] = min(f[i][j][k][0], c[0] + f[a][j][k][0]);
                f[i][j][k][0] = min(f[i][j][k][0], c[1] + f[a][j][k][1]);
                f[i][j][k][1] = min(f[i][j][k][1], c[2] + f[i][b][k][1]);
                f[i][j][k][1] = min(f[i][j][k][1], c[1] + f[i][b][k][0]);
                if (k == 0)
                {
                    continue;
                }
                if (f[a][j][k - 1][0] + c[0] <= t[i])
                {
                    f[i][j][k][0] = min(f[i][j][k][0], f[a][j][k - 1][0] + c[0]);
                }
                if (f[a][j][k - 1][1] + c[1] <= t[i])
                {
                    f[i][j][k][0] = min(f[i][j][k][0], f[a][j][k - 1][1] + c[1]);
                }
                if (f[i][b][k - 1][1] + c[2] <= t[j])
                {
                    f[i][j][k][1] = min(f[i][j][k][1], f[i][b][k - 1][1] + c[2]);
                }
                if (f[i][b][k - 1][0] + c[1] <= t[j])
                {
                    f[i][j][k][1] = min(f[i][j][k][1], f[i][b][k - 1][0] + c[1]);
                }
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            for (int k = 0; k <= n; ++k)
            {
                for (int h = 0; h < 2; ++h)
                {
                    if (f[i][j][k][h] <= 1e9)
                    {
                        res = max(res, k);
                    }
                }
            }
        }
    }
    cout << res;
    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...