Submission #1206676

#TimeUsernameProblemLanguageResultExecution timeMemory
1206676HappyCapybaraOvertaking (IOI23_overtaking)C++20
65 / 100
3593 ms31704 KiB
#include "overtaking.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long

int N, M, X;
vector<int> S;
vector<vector<pair<ll,ll>>> E;

void init(int L, int N, vector<ll> T, vector<int> W, int X, int M, vector<int> S){
    ::N = N;
    ::M = M;
    ::X = X;
    ::S = S;
    E.resize(M, vector<pair<ll,ll>>(N));
    for (int i=0; i<N; i++) E[0][i].first = T[i];
    for (int j=1; j<M; j++){
        ll cur = 0;
        vector<pair<pair<ll,ll>,int>> v;
        for (int i=0; i<N; i++) v.push_back({{E[j-1][i].first, W[i]}, i});
        sort(v.begin(), v.end());
        for (auto [dc, i] : v){
            ll exp = E[j-1][i].first+(ll)W[i]*(ll)(S[j]-S[j-1]);
            cur = max(cur, exp);
            E[j][i].first = cur;
        }
    }
    for (int i=0; i<N; i++){
        for (int j=0; j<M-1; j++) E[j][i].second = E[j+1][i].first;
    }
    for (int j=0; j<M-1; j++){
        sort(E[j].begin(), E[j].end());
        for (int i=1; i<N; i++) E[j][i].second = max(E[j][i].second, E[j][i-1].second);
    }
    return;
}

ll arrival_time(ll Y){
    ll cur = Y;
    for (int j=1; j<M; j++){
        ll next = cur+(ll)X*(ll)(S[j]-S[j-1]);
        int l = -1, r = N;
        while (l < r-1){
            int mid = (l+r)/2;
            if (E[j-1][mid].first < cur) l = mid;
            else r = mid;
        }
        if (l != -1) next = max(next, E[j-1][l].second);
        cur = next;
    }
    return cur;
}
#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...