結果
| 問題 |
No.2242 Cities and Teleporters
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-03-11 00:45:21 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 362 ms / 3,000 ms |
| コード長 | 1,814 bytes |
| コンパイル時間 | 1,809 ms |
| コンパイル使用メモリ | 202,620 KB |
| 最終ジャッジ日時 | 2025-02-11 09:28:28 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using i64 = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N;
std::cin >> N;
std::vector<int> H(N), T(N);
for (int i = 0; i < N; i++) {
std::cin >> H[i];
}
for (int i = 0; i < N; i++) {
std::cin >> T[i];
}
const int logN = std::__lg(N);
std::vector f(logN + 1, std::vector(N, -1));
std::vector<int> order(N);
std::iota(order.begin(), order.end(), 0);
std::sort(order.begin(), order.end(), [&](int i, int j) {
return H[i] < H[j];
});
std::vector<int> pre(N);
pre[0] = order[0];
for (int i = 1; i < N; i++) {
pre[i] = T[order[i]] > T[pre[i - 1]] ? order[i] : pre[i - 1];
}
for (int i = 0; i < N; i++) {
int j = std::partition_point(order.begin(), order.end(), [&](int x) {
return H[x] <= T[i];
}) - order.begin();
if (j > 0) {
f[0][i] = pre[j - 1];
}
if (f[0][i] == -1 || (T[i] > T[f[0][i]])) {
f[0][i] = i;
}
}
for (int j = 0; j < logN; j++) {
for (int i = 0; i < N; i++) {
f[j + 1][i] = f[j][f[j][i]];
}
}
int Q;
std::cin >> Q;
while (Q--) {
int A, B;
std::cin >> A >> B;
A--, B--;
int ans = 0;
for (int i = logN; i >= 0; i--) {
if (T[f[i][A]] < H[B]) {
ans += 1 << i;
A = f[i][A];
}
}
if (T[A] < H[B]) {
A = f[0][A];
ans += 1;
}
if (T[A] < H[B]) {
ans = -1;
} else {
ans += 1;
}
std::cout << ans << "\n";
}
return 0;
}