Submission #1245423

#TimeUsernameProblemLanguageResultExecution timeMemory
1245423GeforgsCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
449 ms227736 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <unordered_map>
#include <stack>
#include <bit>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#define ll long long
#define ld long double
#define inf (ll)(2*1e18)
#define sort(a) sort(a.begin(), a.end())
#define reverse(a) reverse(a.begin(), a.end())
#define pb push_back
#define endl "\n"
using namespace std;

void solve(){
    ll n, l, i, x, y, val, pos, res=0, time, cur, len;
    cin>>n>>l;
    vector<ll> a(2*n+1);
    vector<ll> b(2*n+1);
    a[n] = l;
    unordered_map<ll, unordered_map<ll, vector<vector<ll>>>> dp;
    for(i=n+1;i<=2*n;++i){
        cin>>x;
        a[i] = x+l;
        a[i-n-1] = x;
    }
    for(i=n+1;i<=2*n;++i){
        cin>>x;
        b[i] = x;
        b[i-n-1] = x;
    }
    dp[n][n] = vector<vector<ll>>(n+1, vector<ll>(2, inf));
    dp[n][n][0][0] = 0;
    for(len=0;len<n;++len){
        for(x=0;x<=2*n-len;++x){
            y = x + len;
            if(dp[x][y].empty()) continue;
            for(val=0;val<=len;++val){
                for(pos=0;pos<2;++pos){
                    time = dp[x][y][val][pos];
                    if(time == inf) continue;
                    if(pos){
                        cur = y;
                    }else{
                        cur = x;
                    }
                    if(time + a[cur] - a[x-1] <= b[x-1]){
                        if(dp[x-1][y].empty()) dp[x-1][y] = vector<vector<ll>>(n+1, vector<ll>(2, inf));
                        if(dp[x-1][y][val+1][0] > time + a[cur] - a[x-1]){
                            dp[x-1][y][val+1][0] = time + a[cur] - a[x-1];
                        }
                    }else{
                        if(dp[x-1][y].empty()) dp[x-1][y] = vector<vector<ll>>(n+1, vector<ll>(2, inf));
                        if(dp[x-1][y][val][0] > time + a[cur] - a[x-1]){
                            dp[x-1][y][val][0] = time + a[cur] - a[x-1];
                        }
                    }
                    if(time + a[y+1] - a[cur] <= b[y+1]){
                        if(dp[x][y+1].empty()) dp[x][y+1] = vector<vector<ll>>(n+1, vector<ll>(2, inf));
                        if(dp[x][y+1][val+1][1] > time + a[y+1] - a[cur]){
                            dp[x][y+1][val+1][1] = time + a[y+1] - a[cur];
                        }
                    }else{
                        if(dp[x][y+1].empty()) dp[x][y+1] = vector<vector<ll>>(n+1, vector<ll>(2, inf));
                        if(dp[x][y+1][val][1] > time + a[y+1] - a[cur]){
                            dp[x][y+1][val][1] = time + a[y+1] - a[cur];
                        }
                    }
                }
            }
        }
    }
    for(x=0;x<=2*n-len;++x){
        y = x + len;
        if(dp[x][y].empty()) continue;
        for(val=0;val<=len;++val){
            for(pos=0;pos<2;++pos){
                if(dp[x][y][val][pos] == inf) continue;
                res = max(res, val);
            }
        }
    }
    cout<<res<<endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    srand(time(nullptr));
    ll t=1;
//    cin>>t;
    for(;t>0;--t){
        solve();
    }
    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...