Submission #35816925


Source Code Expand

#include <bits/stdc++.h>

using namespace std;

template<typename T>
vector<array<T, 2>> merge(vector<array<T, 2>> v) {
    if (v.empty())
        return {};

    sort(v.begin(), v.end());

    vector<array<T, 2>> tmp;

    tmp.push_back(v[0]);

    for (auto [l, r] : v) {
        auto &[l1, r1] = tmp.back();

        if (l <= r1) {
            r1 = max(r1, r);
        } else {
            tmp.push_back({l, r});
        }
    }

    return tmp;
};

template<typename T>
vector<array<T, 2>> filter(vector<array<T, 2>> v) {
    if (v.empty())
        return {};

    sort(v.begin(), v.end());

    vector<array<T, 2>> tmp;

    tmp.push_back(v[0]);

    for (auto [l, r] : v) {
        auto &[l1, r1] = tmp.back();

        if (r <= r1)
            continue;

        if (l == l1)
            tmp.pop_back();

        tmp.push_back({l, r});
    }

    return tmp;
};

template<typename T>
int getPos(const vector<array<T, 2>> &v, T x) {
    if (v.empty())
        return -1;

    auto p = lower_bound(v.begin(), v.end(), array<T, 2> {x + 1, numeric_limits<T>::min()});

    if (p == v.begin())
        return -1;

    p = prev(p);

    if ((*p)[1] < x)
        return -1;

    return p - v.begin();
};

int main() {
    cin.tie(NULL)->ios_base::sync_with_stdio(false);
    int n, m, q;
    cin >> n >> m >> q;
    vector<array<int, 2>> elevators;
    vector<vector<array<int, 2>>> e(n + 1);

    for (int i = 1; i <= m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        e[a].push_back({b, c});
    }

    for (auto &v : e) {
        v = merge(v);
        elevators.insert(elevators.end(), v.begin(), v.end());
    }

    elevators = filter(elevators);
    m = elevators.size();

    int lg = log2(m) + 1;
    auto f = vector(lg, vector(m, 0));

    for (int i = 0, j = 0; i < m; ++i) {
        while (j + 1 < m && elevators[j + 1][0] <= elevators[i][1])
            ++j;

        f[0][i] = j;
    }

    for (int i = 1; i < lg; ++i) {
        for (int j = 0; j < m; ++j) {
            f[i][j] = f[i - 1][f[i - 1][j]];
        }
    }

    for (int i = 1; i <= q; ++i) {
        int a, b, x, y;
        cin >> a >> x >> b >> y;

        if (x > y) {
            swap(a, b);
            swap(x, y);
        }

        int ans = y - x;

        if (int p = getPos(e[a], x); p != -1) {
            x = e[a][p][1];
        }

        if (int p = getPos(e[b], y); p != -1) {
            y = e[b][p][0];
        }

        if (y <= x) {
            cout << ans + (a != b) << "\n";
            continue;
        }

        int p = getPos(elevators, x);

        if (p == -1) {
            cout << -1 << "\n";
            continue;
        }

        ++ans;
        x = elevators[p][1];

        if (x >= y) {
            cout << ans + 1 << "\n";
            continue;
        }

        for (int i = lg - 1; i >= 0; --i) {
            if (elevators[f[i][p]][1] < y) {
                p = f[i][p];
                ans += 1 << i;
            }
        }

        ++ans;
        p = f[0][p];
        x = elevators[p][1];

        if (x < y) {
            cout << -1 << "\n";
        } else {
            cout << ans + 1 << "\n";
        }
    }

    return 0;
}

Submission Info

Submission Time
Task G - Elevators
User SkqLiiiao
Language C++ (GCC 9.2.1)
Score 600
Code Size 3166 Byte
Status AC
Exec Time 382 ms
Memory 28780 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 60
Set Name Test Cases
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt
Case Name Status Exec Time Memory
example_00.txt AC 8 ms 3684 KiB
example_01.txt AC 2 ms 3604 KiB
test_00.txt AC 97 ms 6636 KiB
test_01.txt AC 171 ms 10916 KiB
test_02.txt AC 137 ms 9088 KiB
test_03.txt AC 137 ms 8092 KiB
test_04.txt AC 89 ms 8264 KiB
test_05.txt AC 254 ms 15580 KiB
test_06.txt AC 255 ms 15504 KiB
test_07.txt AC 261 ms 15696 KiB
test_08.txt AC 255 ms 15648 KiB
test_09.txt AC 256 ms 15756 KiB
test_10.txt AC 243 ms 28692 KiB
test_11.txt AC 241 ms 28708 KiB
test_12.txt AC 246 ms 28716 KiB
test_13.txt AC 240 ms 28632 KiB
test_14.txt AC 240 ms 28716 KiB
test_15.txt AC 246 ms 28716 KiB
test_16.txt AC 244 ms 28720 KiB
test_17.txt AC 241 ms 28780 KiB
test_18.txt AC 362 ms 28724 KiB
test_19.txt AC 382 ms 28652 KiB
test_20.txt AC 369 ms 28744 KiB
test_21.txt AC 369 ms 28632 KiB
test_22.txt AC 286 ms 28540 KiB
test_23.txt AC 291 ms 28644 KiB
test_24.txt AC 294 ms 28600 KiB
test_25.txt AC 290 ms 28636 KiB
test_26.txt AC 66 ms 3548 KiB
test_27.txt AC 66 ms 3556 KiB
test_28.txt AC 68 ms 3680 KiB
test_29.txt AC 66 ms 3728 KiB
test_30.txt AC 69 ms 3608 KiB
test_31.txt AC 67 ms 3740 KiB
test_32.txt AC 71 ms 3612 KiB
test_33.txt AC 67 ms 3488 KiB
test_34.txt AC 256 ms 15644 KiB
test_35.txt AC 259 ms 15528 KiB
test_36.txt AC 261 ms 15472 KiB
test_37.txt AC 247 ms 15592 KiB
test_38.txt AC 244 ms 15396 KiB
test_39.txt AC 243 ms 15668 KiB
test_40.txt AC 251 ms 15580 KiB
test_41.txt AC 246 ms 15672 KiB
test_42.txt AC 200 ms 11524 KiB
test_43.txt AC 198 ms 11540 KiB
test_44.txt AC 201 ms 11544 KiB
test_45.txt AC 199 ms 11584 KiB
test_46.txt AC 199 ms 11600 KiB
test_47.txt AC 200 ms 11596 KiB
test_48.txt AC 198 ms 11644 KiB
test_49.txt AC 196 ms 11552 KiB
test_50.txt AC 197 ms 12284 KiB
test_51.txt AC 208 ms 12380 KiB
test_52.txt AC 203 ms 12256 KiB
test_53.txt AC 199 ms 12284 KiB
test_54.txt AC 201 ms 12316 KiB
test_55.txt AC 212 ms 12380 KiB
test_56.txt AC 206 ms 12392 KiB
test_57.txt AC 203 ms 12384 KiB