Submission #1233853

#TimeUsernameProblemLanguageResultExecution timeMemory
1233853AMnuOvertaking (IOI23_overtaking)C++20
65 / 100
3585 ms1824496 KiB
#include "overtaking.h" #include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef pair<ll,ll> pii; const ll INF = 2e18; ll sh, ans; struct tree { ll val, L, R; tree *lef, *rig; tree(ll x,ll y) { val = 0; L = x; R = y; lef = rig = 0; } void query(ll x) { ans = max(ans,val); ll mid = (L+R)/2; if (x <= mid && lef) { lef->query(x); } if (x > mid && rig) { rig->query(x); } } void update(ll x,ll y,ll z) { if (x <= L && y >= R) { val = z; return; } ll mid = (L+R)/2; if (x <= mid) { if (!lef) lef = new tree(L,mid); lef->update(x,y,z); } if (y > mid) { if (!rig) rig = new tree(mid+1,R); rig->update(x,y,z); } } } root(1,INF); void init(int L,int N,vector<ll>T,vector<int>W,int X,int M,vector<int>S) { sh = (ll)X*L; vector <pii> V; for (int i=0;i<N;i++) { if (W[i] > X) { V.push_back({T[i]+sh,W[i]-X}); } } N = V.size(); if (!N) { return; } vector <pii> U; for (int i=1;i<M;i++) { int s = S[i]-S[i-1]; sort(V.begin(),V.end()); for (int i=0;i<N;i++) { V[i].fi += V[i].se*s; } for (int i=1;i<N;i++) { V[i].fi = max(V[i].fi,V[i-1].fi); } for (int i=N-1;i>=0;i--) { U.push_back({V[i].fi-V[i].se*s,V[i].fi}); } } reverse(U.begin(),U.end()); for (pii u : U) { ans = u.se; root.query(u.se); root.update(u.fi+1,u.se-1,ans); } } long long arrival_time(ll Y) { ans = Y+sh; root.query(Y+sh); return ans; }
#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...