Submission #1066900

#TimeUsernameProblemLanguageResultExecution timeMemory
1066900mychecksedadOvertaking (IOI23_overtaking)C++17
19 / 100
7 ms1884 KiB
#include "overtaking.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define all(x) x.begin(),x.end() #define ll long long #define ff first #define ss second const int N = 3005; const ll INF = 1e18; set<pair<ll, ll>> pref[N]; vector<ll> T, W, S; ll n, m, x, L; set<array<ll, 3>> SE; ll tots = 0; void init(int Ll, int nn, std::vector<long long> t, std::vector<int> w, int xx, int mm, std::vector<int> s) { L = Ll, n=nn, m=mm, x=xx; for(int i = 0; i < n; ++i){ if(w[i] > x) W.pb(w[i]), T.pb(t[i]); } for(int f: s) S.pb(f); --m; n = W.size(); vector<pair<ll, int>> F; for(int i =0; i < n; ++i) F.pb({W[i], i}); sort(all(F)); reverse(all(F)); vector<vector<ll>> dp(n + 1, vector<ll>(m + 2)); for(int i = 0; i < n; ++i){ dp[i][0] = T[F[i].ss]; for(int j = 1; j <= m; ++j){ ll mx = dp[i][j - 1] + F[i].ff * (S[j] - S[j-1]); auto pos = pref[j].lower_bound(pair<ll,ll>{dp[i][j - 1], -1}); if(pos == pref[j].begin()){ dp[i][j] = mx; }else{ pos = prev(pos); dp[i][j] = max(mx, (*pos).ss); } pref[j].insert({dp[i][j - 1], dp[i][j]}); } } // for(int i = 1; i <= m; ++i){ // for(auto p: pref[i]) cout << p.ff << ' ' << p.ss << '\n'; // cout << '\n'; // } // cout<<"c\n"; vector<vector<array<ll, 3>>> ss(m + 1); for(int i = 1; i <= m; ++i){ tots += S[i] - S[i - 1]; for(auto p: pref[i]){ p.ff++; if(p.ss - x * (S[i] - S[i - 1]) >= p.ff){ ss[i].pb({p.ff - x * (tots - (S[i] - S[i-1])), p.ss - x * tots, p.ss + (L-tots) * x}); } } sort(all(ss[i])); for(int j = int(ss[i].size()) - 2; j >= 0; --j){ ss[i][j][1] = min(ss[i][j][1], ss[i][j + 1][0] - 1); } // cout << x * tots << '\n'; // for(auto x: ss[i]){ // cout << x[0] << ' ' << x[1] << ' ' << x[2] << '\n'; // } // cout << endl; } // cout << "good " << endl; SE.insert({-INF, INF, -1}); for(int j = m; j >= 1; --j){ for(auto p: ss[j]){ ll l = p[0], r = p[1], to = p[2]; if(r < l) continue; ll l2 = -1, r2 = -1; auto it = SE.lower_bound(array<ll,3>{l, -1, 0}); while(it != SE.end() && (*it)[0] <= r){ auto f = *it; auto it2 = next(it); // cout << f[1] << "wtf"; if(f[1] >= r){ if(f[2] != -1){ to = max(to, f[2]); }else{ if(it2 == SE.end()){ // r + 1, inf, -1 // r + 1, tooo, -1 // cout << "wtf" << endl; l2 = r + 1; r2 = INF; }else{ l2 = r + 1; r2 = (*it2)[0] - 1; } } } // cout << "wtf" << endl; SE.erase(it); it = SE.lower_bound(array<ll,3>{l, -1, 0}); } if(l2 != -1) SE.insert({l2, r2, -1}); // for(auto x: SE){ // cout << x[0] << ' ' << x[1] << ' ' << x[2] << '\n'; // } // cout << j << " phase " << l << ' ' << r << ' ' << to << endl; it = SE.lower_bound(array<ll,3>{l, -1, 0}); if(it != SE.begin()){ auto f = *prev(it); if(f[1] >= l){ if(f[1] == r){ to = max(to, f[2]); } SE.erase(prev(it)); if(f[0] <= l - 1) SE.insert({f[0], l - 1, f[2]}); } } SE.insert({l, r, to}); if((*prev(SE.end()))[1] < INF){ SE.insert({(*prev(SE.end()))[1] + 1, INF, -1}); } // for(auto x: SE){ // cout << x[0] << ' ' << x[1] << ' ' << x[2] << '\n'; // } // cout << j << " phase " << l << ' ' << r << ' ' << to << endl; // cout << '\n'; } } return; } long long arrival_time(long long Y) { // ll cur = Y; // for(int j = 1; j <= m; ++j){ // ll mx = cur + x * (S[j] - S[j-1]); // auto pos = pref[j].lower_bound(pair<ll,ll>{cur, -1}); // if(pos == pref[j].begin()){ // cur = mx; // }else{ // pos = prev(pos); // cur = max(mx, (*pos).ss); // } // } auto it = SE.lower_bound(array<ll,3>{Y, INF+1, INF}); --it; if((*it)[2] == -1) return Y + x * L; return (*it)[2]; }
#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...