Submission #861666

#TimeUsernameProblemLanguageResultExecution timeMemory
861666dsyzCollecting Stamps 3 (JOI20_ho_t3)C++17
100 / 100
119 ms129064 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (1000005)
int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	ll N,L;
	cin>>N>>L;
	ll X[N + 2], T[N + 2];
	for(ll i = 1;i <= N;i++){
		cin>>X[i];
	}
	for(ll i = 1;i <= N;i++){
		cin>>T[i];
	}
	X[0] = 0, T[0] = -1;
	X[N + 1] = L, T[N + 1] = -1;
	ll dp[N + 2][N + 2][N + 1][2];
	for(ll l = 0;l <= N + 1;l++){
		for(ll r = 0;r <= N + 1;r++){
			for(ll k = 0;k <= N;k++){
				dp[l][r][k][0] = 1e18;
				dp[l][r][k][1] = 1e18;
			}
		}
	}
	dp[0][N + 1][0][0] = 0;
	dp[0][N + 1][0][1] = 0;
	for(ll l = 0;l <= N + 1;l++){
		for(ll r = N + 1;r > l;r--){
			for(ll k = 0;k <= N;k++){
				if(l >= 1){
					dp[l][r][k][0] = min(dp[l][r][k][0],dp[l - 1][r][k - 1][0] + min(X[l] - X[l - 1],L - (X[l] - X[l - 1])));
					dp[l][r][k][0] = min(dp[l][r][k][0],dp[l - 1][r][k - 1][1] + min(X[r] - X[l],L - (X[r] - X[l])));
					if(dp[l][r][k][0] > T[l]) dp[l][r][k][0] = 1e18;
					
					dp[l][r][k][0] = min(dp[l][r][k][0],dp[l - 1][r][k][0] + min(X[l] - X[l - 1],L - (X[l] - X[l - 1])));
					dp[l][r][k][0] = min(dp[l][r][k][0],dp[l - 1][r][k][1] + min(X[r] - X[l],L - (X[r] - X[l])));
				}
				if(r <= N){
					dp[l][r][k][1] = min(dp[l][r][k][1], dp[l][r + 1][k - 1][1] + min(X[r + 1] - X[r],L - (X[r + 1] - X[r])));
                    dp[l][r][k][1] = min(dp[l][r][k][1], dp[l][r + 1][k - 1][0] + min(X[r] - X[l],L - (X[r] - X[l])));
                    if(dp[l][r][k][1] > T[r]) dp[l][r][k][1] = 1e18;
                    
                    dp[l][r][k][1] = min(dp[l][r][k][1], dp[l][r + 1][k][1] + min(X[r + 1] - X[r],L - (X[r + 1] - X[r])));
                    dp[l][r][k][1] = min(dp[l][r][k][1], dp[l][r + 1][k][0] + min(X[r] - X[l],L - (X[r] - X[l])));
				}
			}
		}
	}
	ll ans = 0;
	for(ll l = 0;l <= N + 1;l++){
		for(ll r = 0;r <= N + 1;r++){
			for(ll k = 0;k <= N;k++){
				if(min(dp[l][r][k][0],dp[l][r][k][1]) < 1e18){
					ans = max(ans,k);
				}
			}
		}
	}
	cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...