Submission #841951

#TimeUsernameProblemLanguageResultExecution timeMemory
841951LucppOvertaking (IOI23_overtaking)C++17
65 / 100
3532 ms34176 KiB
#include <bits/stdc++.h>
#include "overtaking.h"
using namespace std;
using ll = long long;

int L, M;
ll X;
vector<vector<pair<ll, ll>>> v, f;
vector<int> S;

void init(int Lin, int N, vector<ll> T, vector<int> W, int Xin, int Min, vector<int> Sin){
    L = Lin, M = Min, X = Xin, S = Sin;
    vector<int> ord(N);
    for(int i = 0; i < N; i++) ord[i] = i;
    sort(ord.begin(), ord.end(), [&](int i, int j){return T[i] < T[j];});
    v.resize(M);
    for(int i : ord){
        if(W[i] <= X) continue;
        if(v[0].empty()) v[0].emplace_back(T[i], (ll)W[i]);
        else v[0].emplace_back(T[i], (ll)W[i]);
    }
    sort(v[0].begin(), v[0].end());
    f.resize(M-1);
    for(int k = 1; k < M; k++){
        ll d = S[k]-S[k-1];
        ll last = 0;
        for(auto [t, w] : v[k-1]){
            ll e = t+w*d;
            ll t2 = max(last, e);
            v[k].emplace_back(t2, w);
            f[k-1].emplace_back(t, t2);
            last = t2;
        }
        sort(v[k].begin(), v[k].end());
    }
}

ll arrival_time(ll Y){
    ll t = Y;
    for(int k = 0; k < M-1; k++){
        ll d = S[k+1]-S[k];
        ll e = t+d*X;
        ll bound = 0;
        auto it = lower_bound(f[k].begin(), f[k].end(), make_pair(t, 0ll));
        if(it != f[k].begin()){
            it--;
            bound = it->second;
        }
        t = max(e, bound);
    }
    return t;
}
#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...