Submission #1154432

#TimeUsernameProblemLanguageResultExecution timeMemory
1154432beabossPassport (JOI23_passport)C++20
6 / 100
491 ms93648 KiB
// Source: #include "bits/stdc++.h" using namespace std; #define s second #define f first #define pb push_back typedef long long ll; typedef pair<int, int> pii; typedef vector<pii> vpii; typedef vector<int> vi; #define FOR(i, a, b) for (int i = (a); i<b; i++) bool ckmin(int& a, int b){ return b < a ? a = b, true : false; } bool ckmax(int& a, int b){ return b > a ? a = b, true : false; } const int N = 2e5 + 10; vpii adj[6 * N]; vi d1(6 * N, N + 1); vi dn(6 * N, N + 1); vi db(6 * N, N + 1); int n; void connect(int ul, int ur, int node, int i = 1, int l = 1, int r = n+1) { if (r <= ul || ur <= l) return; if (r <= ur && l >= ul) { adj[i + 2*n].pb({node, 0}); return; } int m = (l + r)/2; connect(ul, ur, node, 2*i, l, m); connect(ul, ur, node, 2*i+1, m, r); } void build(int i = 1, int l = 1, int r = n+1) { if (r - l == 1) { adj[l].pb({i + 2*n, 0}); return; } int m = (l + r)/2; adj[2*i + 2*n].pb({i + 2*n, 0}); adj[2*i+1 + 2*n].pb({i + 2*n, 0}); build(2*i, l, m); build(2*i+1, m, r); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; build(); vi all; FOR(i, 1, n+1) { adj[i + n].pb({i, 1}); int l, r; cin >> l >> r; if (l == 1 && r == n) all.pb(i); connect(l, r+1, i+n); } deque<int> d; d.push_back(1); d1[1]=0; while (!d.empty()) { int cur = d.front(); d.pop_front(); for (auto val: adj[cur]) { if (d1[val.f] > d1[cur] + val.s) { d1[val.f] = d1[cur] + val.s; if (val.s == 0) d.push_front(val.f); else d.push_back(val.f); } } } d.push_back(n); dn[n]=0; while (!d.empty()) { int cur = d.front(); d.pop_front(); // cout << cur << dn[cur] << endl; for (auto val: adj[cur]) { if (dn[val.f] > dn[cur] + val.s) { dn[val.f] = dn[cur] + val.s; if (val.s == 0) d.push_front(val.f); else d.push_back(val.f); } } } for (auto ax: all) { d.push_back(ax); db[ax]=0; } while (!d.empty()) { int cur = d.front(); d.pop_front(); // cout << cur << dn[cur] << endl; for (auto val: adj[cur]) { if (db[val.f] > db[cur] + val.s) { db[val.f] = db[cur] + val.s; if (val.s == 0) d.push_front(val.f); else d.push_back(val.f); } } } int q; cin >> q; FOR(_, 0, q) { int x; cin >> x; int res = min(1 + db[x], d1[x] + dn[x] - (x != 1 && x != n)); if (res > n) cout << -1 << endl; else cout << res << endl; } }
#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...