結果

問題 No.2242 Cities and Teleporters
コンテスト
ユーザー norioc
提出日時 2026-05-04 04:10:10
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 2,298 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,552 ms
コンパイル使用メモリ 230,820 KB
実行使用メモリ 26,268 KB
最終ジャッジ日時 2026-05-04 04:10:29
合計ジャッジ時間 17,870 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 20 WA * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

struct Doubling {
    int nb;
    vector<vector<int>> d;

    Doubling(const vector<int>& xs, int nb = 20) : nb(nb) {
        int n = xs.size();
        d.assign(nb, vector<int>(n));
        for (int i = 0; i < n; i++) d[0][i] = xs[i];
        for (int k = 0; k < nb - 1; k++) {
            for (int i = 0; i < n; i++) {
                d[k + 1][i] = d[k][d[k][i]];
            }
        }
    }

    int query(long long k, int start) {
        int cur = start;
        for (int i = 0; i < nb; i++) {
            if (k & (1LL << i)) {
                cur = d[i][cur];
            }
        }
        return cur;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin >> N;
    vector<int> H(N), T(N);
    for (int i = 0; i < N; i++) cin >> H[i];
    for (int i = 0; i < N; i++) cin >> T[i];
    int Q;
    cin >> Q;

    vector<tuple<int,int,int>> cities;
    for (int i = 0; i < N; i++) {
        cities.emplace_back(H[i], T[i], i);
    }
    sort(cities.begin(), cities.end());

    vector<pair<int,int>> acc(N);
    for (int i = 0; i < N; i++) {
        auto [h, t, idx] = cities[i];
        if (i == 0) acc[i] = {t, idx};
        else acc[i] = max(acc[i-1], make_pair(t, idx));
    }

    vector<int> nexts;
    for (int i = 0; i < N; i++) {
        int p = upper_bound(cities.begin(), cities.end(), make_tuple(T[i], INT_MAX, INT_MAX)) - cities.begin();
        if (p == 0) {
            nexts.push_back(i);
        } else {
            auto [t, ci] = acc[p-1];
            if (t > T[i]) nexts.push_back(ci);
            else nexts.push_back(i);
        }
    }

    Doubling d(nexts);

    while (Q--) {
        int A, B;
        cin >> A >> B;
        A--; B--;

        long long k = (long long)1e14;
        int ci = d.query(k, A);

        if (H[B] > T[ci]) {
            cout << -1 << '\n';
            continue;
        }

        long long lo = 0, hi = k, res = k;
        while (lo <= hi) {
            long long m = (lo + hi) / 2;
            int ci2 = d.query(m, A);
            if (T[ci2] >= H[B]) {
                res = min(res, m);
                hi = m - 1;
            } else {
                lo = m + 1;
            }
        }

        cout << res + 1 << '\n';
    }

    return 0;
}
0