제출 #1245423

#제출 시각아이디문제언어결과실행 시간메모리
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...