Submission #847786

#TimeUsernameProblemLanguageResultExecution timeMemory
847786sofapudenOvertaking (IOI23_overtaking)C++17
100 / 100
2672 ms45976 KiB
#include<bits/stdc++.h> #include "overtaking.h" using namespace std; typedef long long ll; vector<pair<ll, int>> arr; vector<vector<ll>> dp; vector<vector<ll>> E; vector<ll> nT; vector<int> nW, nS; ll l, n, speed, m; void init(int L, int N, vector<ll> T, vector<int> W, int X, int M, vector<int> S){ E.resize(M, vector<ll> (N)); dp.resize(M, vector<ll> (N, -1)); for(int i = 0; i < N; ++i){ if(W[i] > X){ nT.push_back(T[i]); nW.push_back(W[i]); } } N = nT.size(); T = nT; W = nW; l = L, n = N, speed = X, m = M, nS = S; arr.resize(N); for(int i = 0; i < N; ++i)arr[i] = {T[i], W[i]}; sort(arr.begin(),arr.end()); for(int i = 0; i < N; ++i)E[0][i] = arr[i].first; for(int i = 1; i < M; ++i){ for(int j = 0; j < N; ++j){ arr[j].first += 1ll * arr[j].second * (S[i] - S[i-1]); if(j)arr[j].first = max(arr[j].first, arr[j-1].first); E[i][j] = arr[j].first; } sort(arr.begin(),arr.end()); } return; } long long f(int X, int Y){ auto &d = dp[X][Y]; if(~d)return d; if(Y == 0){ return d = E[X][Y] + speed * (nS[m - 1] - nS[X]); } if(E[X][Y] == E[X][Y - 1]){ return d = f(X, Y - 1); } //bin search for(int i = X + 1; i < m; ++i){ if(E[X][Y] + speed * (nS[i] - nS[X]) <= E[i][Y-1]) return d = f(i, Y - 1); } return d = E[X][Y] + speed * (nS[m - 1] - nS[X]); } long long arrival_time(long long Y){ // bin search int st = n - 1; for(int i = 0; i < n; ++i)if(Y <= E[0][i]){ st = i - 1; break; } if(st == -1){ return Y + speed * (nS[m-1] - nS[0]); } for(int i = 1; i < m; ++i){ if(Y + speed * (nS[i] - nS[0]) <= E[i][st])return f(i, st); } return Y + speed * (nS[m-1] - nS[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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...