Submission #841478

#TimeUsernameProblemLanguageResultExecution timeMemory
841478model_codeOvertaking (IOI23_overtaking)C++17
9 / 100
1 ms340 KiB
// incorrect/GA_full_wa.cpp

#include "overtaking.h"
#include <algorithm>
#include <map>
#include <limits>

using namespace std;
using ll = long long;

const ll END = numeric_limits<ll>::max();

map<ll, ll> intervals;

void add_interval(ll start, ll end)
{
    auto it = intervals.lower_bound(end);
    if (it == intervals.begin())
    {
        intervals[start] = end;
        if (!intervals.count(end))
        {
            intervals[end] = END;
        }
        return;
    }
    --it;
    if (it->second != END && it->first <= start)
    {
        return;
    }
    ll dest = it->second == END ? end : it->second;
    if (it->second == END && !intervals.count(end))
    {
        intervals[end] = END;
    }
    intervals[start] = dest;
    while (it->first > start)
    {
        intervals.erase(it--);
    }
}

ll total_time;

void init(int L, int N, std::vector<long long> T, std::vector<int> W, int X, int M, std::vector<int> S)
{
    total_time = L * (ll)X;
    vector<pair<ll, int>> initial;
    for (int i = 0; i < N; i++)
    {
        if (W[i] > X)
        {
            initial.emplace_back(T[i], W[i] - X);
        }
    }
    N = initial.size();
    sort(initial.begin(), initial.end());
    vector<vector<ll>> bus_time(M, vector<ll>(N));
    vector<int> bus_rv(N);
    for (int j = 0; j < N; j++)
    {
        bus_time[0][j] = initial[j].first;
        bus_rv[j] = initial[j].second;
    }
    for (int i = 1; i < M; i++)
    {
        ll dist = S[i] - S[i - 1];
        ll m = 0;
        for (int j = 0; j < N; j++)
        {
            int rv = bus_rv[j];
            ll t = bus_time[i - 1][j] + rv * dist;
            if (t <= m)
            {
                bus_time[i][j] = m;
                int k = j;
                while (k >= 1 && bus_time[i][k - 1] == m && bus_rv[k - 1] > rv)
                {
                    bus_rv[k] = bus_rv[k - 1];
                    k--;
                }
                bus_rv[k] = rv;
            }
            else
            {
                bus_time[i][j] = t;
                m = t;
            }
        }
    }
    for (int i = M - 1; i >= 1; i--)
    {
        for (int j = 0; j < N; j++)
        {
            add_interval(bus_time[i - 1][j], bus_time[i][j]);
        }
    }
}

long long arrival_time(long long Y)
{
    // Does not consider the case when the reserve bus does not meet any other,
    // but it is neither the first nor the last one
    auto it = intervals.lower_bound(Y);
    if (it == intervals.begin() || it == intervals.end())
        return Y + total_time;
    return prev(it)->second + total_time;
}
#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...