Submission #1089725

#TimeUsernameProblemLanguageResultExecution timeMemory
1089725lightonOvertaking (IOI23_overtaking)C++17
65 / 100
3539 ms79252 KiB
#include "overtaking.h" #include<bits/stdc++.h> #define pb push_back #define all(v) v.begin(),v.end() #define forf(i,s,e) for(int i = s; i<=e; i++) #define forb(i,s,e) for(int i = s; i>=e; i--) #define idx(i,v) lower_bound(all(v),i)-v.begin() #define comp(v) v.erase(unique(all(v)),v.end()) #define fs first #define se second #define SP << " " << #define LN << "\n" #define IO cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false); using namespace std; typedef long long ll; ll inf = 1e18; vector<vector<ll> > state; vector<vector<ll> > dp; vector<vector<vector<ll> > > num; vector<vector<ll> > h; vector<ll> vel,st; vector<int> s; ll add; double cross(ll a1, ll b1 , ll a2, ll b2){ return (double)(b2-b1)/(double)(a1-a2); } int n,m; void init(int L, int N, std::vector<long long> T, std::vector<int> W, int X, int M, std::vector<int> S) { s=S; forf(i,0,N-1) if(W[i]-X > 0) vel.pb(W[i]-X), st.pb(T[i]); add = ((ll)X)*L; m = s.size(); n = vel.size(); state.resize(m,{}),dp.resize(m,{}),num.resize(m,{}); h.resize(n,vector<ll>(m,0)); { forf(i, 0, n - 1) h[i][0] = st[i]; forf(i, 0, n - 1) state[0].pb(h[i][0]); sort(all(state[0])), comp(state[0]); dp[0].resize(state[0].size()), num[0].resize(state[0].size()); forf(i, 0, n - 1) num[0][idx(h[i][0], state[0])].pb(i); forf(i, 0, m - 2) { ll pmx = 0; ll delta = s[i + 1] - s[i]; forf(j, 0, (int) state[i].size() - 1) { ll now = state[i][j]; ll tmp = 0; for (int idx: num[i][j]) { ll nxt = max(now + delta * vel[idx], pmx); tmp = max(nxt,tmp); h[idx][i + 1] = nxt; state[i + 1].pb(nxt); } pmx = max(pmx, tmp); dp[i][j] = pmx; } sort(all(state[i + 1])), comp(state[i + 1]); int sz = state[i + 1].size(); dp[i + 1].resize(sz), num[i + 1].resize(sz); forf(j, 0, n - 1) num[i + 1][idx(h[j][i + 1], state[i + 1])].pb(j); } } } long long arrival_time(long long Y) { ll now = Y; forf(i,0,m-2){ int j = lower_bound(all(state[i]),now)-state[i].begin()-1; if(j != -1) now = max(now, dp[i][j]); } return now+add; }
#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...