#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll dim = 3*1e2+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e18 + 77;
#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>
ll n, l;
ll dp[dim][dim][dim][3]; //l r ans 2
ll x[dim], t[dim];
pll can(ll cur, ll st, ll fn, ll tp){
ll dist=0, add=0;
if(fn>n)return{ 0, inf};
if(tp==1){// це те що ми йдемо в тому ж напрямку
dist=abs(x[st]-x[fn]);
if(cur+dist<=t[fn])add=1;
return {add, cur+dist};
}
if(tp==2){
dist=l-abs(x[st]-x[fn]);//+-1
if(cur+dist<=t[fn])add=1;
return {add, cur+dist};
}
}
int main() {
ll u0, v0;
string s1;
cin>>n>>l;
for(int i=0; i<=200; i++){
for(int j=0; j<=200; j++){
for(int k=0; k<=200; k++){
dp[i][j][k][1]=inf;
dp[i][j][k][2]=inf;
}
}
}
for(int i=1; i<=n; i++) {
cin>>x[i];
}
for(int i=1; i<=n; i++) {
cin>>t[i];
}
ll ans=0;
dp[0][0][0][1]=0;
dp[0][0][0][2]=0;
for(int i=0; i<=n; i++){
for(int j=0; j<=n; j++){
if(i+j>=n)continue;
for(int have=0; have<=i+j; have++){
if(dp[i][j][have][1]<inf)ans=max<ll>(ans, have);
if(dp[i][j][have][2]<inf)ans=max<ll>(ans, have);
// i -> i+1
pll op1=can(dp[i][j][have][1], i, i+1, 1);
pll op2=can(dp[i][j][have][1], i, i+1, 2);
ll add=0; ll tm=0;
add=op1.fi; tm=op1.se;
dp[i+1][j][have+add][1]=min(dp[i+1][j][have+add][1], tm);
add=op2.fi; tm=op2.se;
dp[i+1][j][have+add][1]=min(dp[i+1][j][have+add][1], tm);
// i --- j+1
op1=can(dp[i][j][have][1], i, j+1, 1);
op2=can(dp[i][j][have][1], i, j+1, 2);
add=op1.fi; tm=op1.se;
dp[i][j+1][have+add][2]=min<ll>(dp[i][j+1][have+add][2], tm);
add=op2.fi; tm=op2.se;
dp[i][j+1][have+add][2]=min<ll>(dp[i][j+1][have+add][2], tm);
// j -- j+1
op1=can(dp[i][j][have][2], j, j+1, 1);
op2=can(dp[i][j][have][2], j, j+1, 2);
add=op1.fi; tm=op1.se;
dp[i][j+1][have+add][2]=min<ll>(dp[i][j+1][have+add][2], tm);
add=op2.fi; tm=op2.se;
dp[i][j+1][have+add][2]=min(dp[i][j+1][have+add][2], tm);
// j - i+1
op1=can(dp[i][j][have][2], j, i+1, 1);
op2=can(dp[i][j][have][2], j, i+1, 2);
add=op1.fi; tm=op1.se;
dp[i+1][j][have+add][1]=min(dp[i+1][j][have+add][1], tm);
add=op2.fi; tm=op2.se;
dp[i+1][j][have+add][1]=min(dp[i+1][j][have+add][1], tm);
}
}
}
cout<<ans<<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
ho_t3.cpp: In function 'pll can(ll, ll, ll, ll)':
ho_t3.cpp:46:1: warning: control reaches end of non-void function [-Wreturn-type]
46 | }
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |