Submission #554822

#TimeUsernameProblemLanguageResultExecution timeMemory
554822andrei_boacaCollecting Stamps 3 (JOI20_ho_t3)C++17
100 / 100
55 ms66728 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll INF=1e14;
ll n,l,x[205],t[205],dist[205][205],dp[205][205][205][2],ans;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>l;
    for(int i=1;i<=n;i++)
        cin>>x[i];
    for(int i=1;i<=n;i++)
        cin>>t[i];
    for(int i=0;i<=n+1;i++)
        for(int j=0;j<=n+1;j++)
        {
            dist[i][j]=abs(x[i]-x[j]);
            dist[i][j]=min(dist[i][j],l-dist[i][j]);
        }
    for(int i=0;i<=n;i++)
        for(int j=0;j+i<=n;j++)
        {
            for(int take=0;take<=n;take++)
            {
                dp[i][j][take][0]=dp[i][j][take][1]=INF;
                if(i==0&&j==0&&take==0)
                {
                    dp[i][j][take][0]=dp[i][j][take][1]=0;
                    continue;
                }
                if(i-1>=0)
                {
                    ll val=INF;
                    val=min(val,dp[i-1][j][take][0]+dist[i][i-1]);
                    val=min(val,dp[i-1][j][take][1]+dist[i][n-j+1]);
                    if(take>0)
                    {
                        if(dp[i-1][j][take-1][0]+dist[i][i-1]<=t[i])
                            val=min(val,dp[i-1][j][take-1][0]+dist[i][i-1]);
                        if(dp[i-1][j][take-1][1]+dist[i][n-j+1]<=t[i])
                            val=min(val,dp[i-1][j][take-1][1]+dist[i][n-j+1]);
                    }
                    dp[i][j][take][0]=val;
                }
                if(j-1>=0)
                {
                    ll val=INF;
                    val=min(val,dp[i][j-1][take][0]+dist[i][n-j+1]);
                    val=min(val,dp[i][j-1][take][1]+dist[n-(j-1)+1][n-j+1]);
                    if(take>0)
                    {
                        if(dp[i][j-1][take-1][0]+dist[i][n-j+1]<=t[n-j+1])
                            val=min(val,dp[i][j-1][take-1][0]+dist[i][n-j+1]);
                        if(dp[i][j-1][take-1][1]+dist[n-(j-1)+1][n-j+1]<=t[n-j+1])
                            val=min(val,dp[i][j-1][take-1][1]+dist[n-(j-1)+1][n-j+1]);
                    }
                    dp[i][j][take][1]=val;
                }
                if(min(dp[i][j][take][1],dp[i][j][take][0])<INF)
                    ans=max(ans,1LL*take);
            }
        }
    cout<<ans;
    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...