Submission #1266658

#TimeUsernameProblemLanguageResultExecution timeMemory
1266658tvgkPassport (JOI23_passport)C++20
100 / 100
337 ms10292 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define ll long long #define ii pair<int, int> #define fi first #define se second #define tp tuple<int, int, int> const long mxN = 2e5 + 7, inf = 1e9 + 7; struct T { int l, r, id; }; priority_queue<tp, vector<tp>, greater<tp>> pq; int n, tree[mxN * 4], pre[mxN], ans[mxN]; ii dp[mxN]; T a[mxN]; bool cmp(T u, T v) { return u.r < v.r; } void Build(int j = 1, int l = 1, int r = n) { if (l == r) { tree[j] = a[l].l; return; } int mid = (l + r) / 2; Build(j * 2, l, mid); Build(j * 2 + 1, mid + 1, r); tree[j] = min(tree[j * 2], tree[j * 2 + 1]); } void Upd(int val, int mn, int vt, int j = 1, int l = 1, int r = n) { if (a[r].r < vt || vt < tree[j]) return; if (l == r) { mn = min(a[l].l, mn); dp[a[l].id] = {val + 1, mn}; tree[j] = inf; pq.push({val + 1, mn, a[l].id}); return; } int mid = (l + r) / 2; Upd(val, mn, vt, j * 2, l, mid); Upd(val, mn, vt, j * 2 + 1, mid + 1, r); tree[j] = min(tree[j * 2], tree[j * 2 + 1]); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen(task".INP", "r", stdin); // freopen(task".OUT", "w", stdout); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].l >> a[i].r; a[i].id = i; } for (int id = 0; id <= 1; id++) { for (int i = 1; i <= n; i++) dp[i].fi = inf; sort(a + 1, a + n + 1, cmp); Build(); pq.push({0, n, n}); while (pq.size()) { auto [tmp, mn, j] = pq.top(); pq.pop(); Upd(tmp, mn, j); } if (!id) { pre[0] = inf; for (int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], dp[i].fi); pre[n] = 0; } else { for (int i = 1; i <= n; i++) { int j = n + 1 - i; ans[j] = dp[i].fi + pre[n + 1 - dp[i].se]; } } for (int i = 1; i <= n; i++) { a[i].l = n + 1 - a[i].l; a[i].r = n + 1 - a[i].r; swap(a[i].l, a[i].r); a[i].id = n + 1 - a[i].id; } } for (int id = 0; id <= 1; id++) { for (int i = 1; i <= n; i++) { a[i].l = n + 1 - a[i].l; a[i].r = n + 1 - a[i].r; swap(a[i].l, a[i].r); a[i].id = n + 1 - a[i].id; } for (int i = 1; i <= n; i++) dp[i].fi = inf; sort(a + 1, a + n + 1, cmp); Build(); pq.push({0, n, n}); while (pq.size()) { auto [tmp, mn, j] = pq.top(); pq.pop(); Upd(tmp, mn, j); } if (!id) { pre[0] = inf; for (int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], dp[i].fi); pre[n] = 0; } else { for (int i = 1; i <= n; i++) { int j = n + 1 - i; ans[i] = min(ans[i], dp[i].fi + pre[n + 1 - dp[i].se]); } } } int q; cin >> q; for (int i = 1; i <= q; i++) { int tmp; cin >> tmp; if (ans[tmp] >= inf) cout << -1 << '\n'; else cout << ans[tmp] << '\n'; } }
#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...