Submission #1218472

#TimeUsernameProblemLanguageResultExecution timeMemory
1218472vaneaOvertaking (IOI23_overtaking)C++20
0 / 100
0 ms580 KiB
#include <bits/stdc++.h>
#include "overtaking.h"
using namespace std;
using ll = long long;

const int mxN = 1e3+10;
const ll INF = 1e18+10;
int l, n;vector<ll> t; vector<int> w; int x; int m; vector<int> s;
array<ll, 2> st[mxN][4*mxN];

void upd(int v, int node, int l, int r, int k, ll t, ll w) {
    if(l == r && l == k) {
        st[v][node] = {t, w};
        return ;
    }
    if(l > k || r < k) return ;
    int mid = (l+r)/2;
    upd(v, node*2, l, mid, k, t, w);
    upd(v, node*2+1, mid+1, r, k, t, w);
    st[v][node] = max(st[v][node*2], st[v][node*2+1]);
}

array<ll, 2> comb(array<ll, 2> a, array<ll, 2> b) {
    return {a[0]+b[0], a[1]+b[1]};
}

array<ll, 2> qry(int v, int node, int l, int r, int k) {
    if(l == r && l == k) return st[v][node];
    if(l > k || r < k) return {0, 0};
    int mid = (l+r)/2;
    return comb(qry(v, node*2, l, mid, k), qry(v, node*2+1, mid+1, r, k));
}

int qry1(int v, int node, int l, int r, ll x) {
    if(l == r) return l;
    int mid = (l+r)/2;
    if(st[v][node*2][0] >= x) return qry1(v, node*2, l, mid, x);
    else return qry1(v, node*2+1, mid+1, r, x);

}

ll qry2(int v, int node, int l, int r, int l1, int r1) {
    if(l1 <= l && r <= r1) return st[v][node][0];
    if(l1 > r || r1 < l) return 0;
    int mid = (l+r)/2;
    return max(qry2(v, node*2, l, mid, l1, r1),
               qry2(v, node*2+1, mid+1, r, l1, r1));
}

void init(int L, int N, vector<ll> T, vector<int> W, int X, int M, vector<int> S) {
    l = L; n = N; t = T; w = W; x = X; m = M; s = S;
    vector<int> ord(n);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int a, int b) {
        if(t[a] == t[b]) return w[a] < w[b];
        return t[a] < t[b];
    });
    for(int i = 0; i < n; i++) {
        upd(0, 1, 0, n-1, i, t[ord[i]], w[ord[i]]);
    }
    for(int j = 1; j < m; j++) {
        set<array<ll, 2>> buses;
        for(int i = 0; i < n; i++) {
            array<ll, 2> now = qry(j-1, 1, 0, n-1, i);
            ll f = now[0] + now[1] * (s[j] - s[j-1]);
            ll s;
            if(buses.empty()) s = 0;
            else {
                s = (*prev(buses.end()))[0];
            }
            ll now_val = max(f, s);
            buses.insert({now_val, now[1]});
        }
        int i = 0;
        for(auto [it, k] : buses) {
            upd(j, 1, 0, n-1, i++, it, k);
        }
    }
}

ll calculate_arrival_time(ll Y) {
    ll last_cnt = (Y > st[0][1][0] ? n : qry1(0, 1, 0, n-1, Y));
    ll last_time = Y;
    ll ans = 0;
    for(int j = 1; j < m; j++) {
        ll f = last_time + x * (s[j] - s[j-1]);
        ll s = qry2(j, 1, 0, n-1, 0, last_cnt-1);
        last_time = max(f, s);
        last_cnt = last_time > st[j][1][0] ? n : qry1(j, 1, 0, n-1, last_time);
        if(j == m-1) ans = last_time;
    }
    return ans;
}

ll arrival_time(ll Y) {
    return calculate_arrival_time(Y);
}

#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...