이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
typedef long long ll;
const ll inf = 1e15;
int main() {
// std::ios_base::sync_with_stdio(false);
// std::cin.tie(nullptr);
ll n;
std::cin >> n;
std::vector<ll> l(n + 1), r(n + 1);
for (ll i = 1; i <= n; ++i) {
std::cin >> l[i] >> r[i];
}
std::vector min_l(n + 1, std::vector<ll>(n + 1, inf));
std::vector max_r(n + 1, std::vector<ll>(n + 1, inf));
for (ll i = 1; i <= n; ++i) {
min_l[i][i] = l[i];
max_r[i][i] = r[i];
for (ll j = i + 1; j <= n; ++j) {
min_l[i][j] = std::min(min_l[i][j - 1], l[j]);
max_r[i][j] = std::max(max_r[i][j - 1], r[j]);
}
}
auto f = [n](ll i, ll j) { return (j - 1) + (i - 1) * n; };
std::vector<std::vector<std::pair<ll, ll>>> adj(n * n);
auto add_edge = [&](ll u, ll v, ll w) { adj[v].push_back({u, w}); };
for (ll i = 1; i <= n; ++i) {
add_edge(f(i, i), f(l[i], r[i]), 1);
for (ll j = i + 1; j <= n; ++j) {
add_edge(f(i, j), f(i + 1, j), 0);
add_edge(f(i, j), f(i, j - 1), 0);
add_edge(f(i, j), f(min_l[i][j], j), 1);
add_edge(f(i, j), f(i, max_r[i][j]), 1);
}
}
std::deque<ll> dq;
dq.push_back(f(1, n));
std::vector<ll> dist(n * n, inf);
std::vector<bool> vis(n * n);
dist[f(1, n)] = 0;
while (!dq.empty()) {
ll node = dq.front();
dq.pop_front();
if (vis[node]) {
continue;
}
vis[node] = true;
for (auto &[i, w] : adj[node]) {
if (dist[node] + w < dist[i]) {
dist[i] = dist[node] + w;
if (w == 0) {
dq.push_front(i);
} else {
dq.push_back(i);
}
}
}
}
ll q;
std::cin >> q;
while (q--) {
ll x;
std::cin >> x;
std::cout << (dist[f(x, x)] == inf ? -1 : dist[f(x, x)]) << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |