Submission #1245436

#TimeUsernameProblemLanguageResultExecution timeMemory
1245436AHOKACollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
80 ms141384 KiB
#include <bits/stdc++.h>

#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

using namespace std;
 
#define threesum cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define F first
#define S second
#define int long long
#define pii pair<int, int>
#define ppp pair<int, pii>
#define dout cout << fixed << setprecision(15)
#define mid ((l + r) >> 1)
#define lc (id << 1)
#define rc (lc + 1)

const int maxn = 2e5 + 10, maxm = 2e2 + 10, oo = 1e18, lg = 19, sq = 1400, mod = 998244353;

int n, ln, ans;

int x[maxm], t[maxm];

int dp[2][maxm][maxm][maxm];

int d(int x, int y){
    return min(abs(x - y), ln - (abs(x - y)));
}

void solve()
{
    cin >> n >> ln;
    
    for (int i = 1; i <= n; i++)
        cin >> x[i];
    for (int i = 1; i <= n;i++)
        cin >> t[i];

    x[0] = 0;
    x[n + 1] = ln;

    t[0] = -oo;
    t[n + 1] = -oo;

    for (int b = 0; b < 2;b++)
        for (int l = 0; l <= n + 5; l++)
            for (int r = 0; r <= n + 5; r++)
                for (int k = 0; k <= n + 5;k++)
                    dp[b][l][r][k] = oo;

    dp[0][0][n + 1][0] = 0;
    dp[1][0][n + 1][0] = 0;

    for (int l = 0; l < n; l++)
    	for (int r = n + 1; r - 1 > l; r--)
    		for (int k = 0; k <= n; k++){
				int tm;

				tm = min(dp[0][l][r][k] + d(x[l + 1], x[l]), dp[1][l][r][k] + d(x[l + 1], x[r]));

				if(tm <= t[l + 1])
					dp[0][l + 1][r][k + 1] = min(dp[0][l + 1][r][k + 1], tm);

				else 
					dp[0][l + 1][r][k] = min(dp[0][l + 1][r][k], tm);

				tm = min(dp[0][l][r][k] + d(x[r - 1], x[l]), dp[1][l][r][k] + d(x[r - 1], x[r]));

				if(tm <= t[r - 1])
					dp[1][l][r - 1][k + 1] = min(dp[1][l][r - 1][k + 1], tm);

				else 
					dp[1][l][r - 1][k] = min(dp[1][l][r - 1][k], tm);
            }

    for (int b = 0; b < 2;b++)
        for (int l = 0; l <= n + 5; l++)
            for (int r = 0; r <= n + 5; r++)
                for (int k = 0; k <= n + 5;k++)
                    if(dp[b][l][r][k] < oo)
                        ans = max(ans, k);

    cout << ans;
}

signed main()
{
    threesum;
    int t = 1;
    //cin >> t;
    while(t--)
        solve();
}

/*
10 87
9 23 33 38 42 44 45 62 67 78
15 91 7 27 31 53 12 91 89 46
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...