Submission #888946

#TimeUsernameProblemLanguageResultExecution timeMemory
888946Alihan_8Passport (JOI23_passport)C++17
48 / 100
2037 ms364308 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ar array #define pb push_back #define ln '\n' #define int long long using i64 = long long; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } const int inf = 1e15 + 1; struct Sparse{ vector <vector<int>> T; vector <int> A; int _s; Sparse(auto &a, int s){ int n = a.size(); T.resize(20); _s = s; A = a; for ( auto &j: A ) j *= s; for ( auto &x: T ) x.resize(n); for ( int i = 0; i < n; i++ ){ T[0][i] = i; } for ( int i = 1; i < 20; i++ ){ int k = 1 << i - 1; for ( int j = 0; j < n; j++ ){ if ( A[T[i - 1][j]] < A[T[i - 1][min(n - 1, j + k)]] ){ T[i][j] = T[i - 1][j]; } else T[i][j] = T[i - 1][min(n - 1, j + k)]; } } } int get(int l, int r){ int lg = __lg(r - l + 1), k = 1 << lg; int u = T[lg][l], v = T[lg][r - k + 1]; return A[u] < A[v] ? u : v; } }; const int N = 2e5 + 1; int S; struct SegTree{ int T[N * 4]; SegTree(){ for ( int i = 0; i < N * 4; i++ ){ T[i] = inf; } } void upd(int v, int l, int r, int pos, int val){ if ( l == r ){ T[v] = val; return; } int md = (l + r) >> 1; if ( pos > md ){ upd(v * 2 + 1, md + 1, r, pos, val); } else{ upd(v * 2, l, md, pos, val); } T[v] = min(T[v * 2], T[v * 2 + 1]); }; void upd(int pos, int val){ upd(1, 0, S - 1, pos, val); } int get(int v, int l, int r, int tl, int tr){ if ( l > tr or r < tl ){ return inf; } if ( tl <= l && tr >= r ){ return T[v]; } int md = (l + r) >> 1; return min(get(v * 2, l, md, tl, tr), get(v * 2 + 1, md + 1, r, tl, tr)); } int get(int l, int r){ return get(1, 0, S - 1, l, r); } } seg; signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; S = n; vector <int> L(n), R(n); for ( int i = 0; i < n; i++ ){ cin >> L[i] >> R[i]; --L[i], --R[i]; } Sparse mn(L, 1), mx(R, -1); vector <int> p(n); iota(all(p), 0); sort(all(p), [&](int &x, int &y){ return R[x] - L[x] > R[y] - L[y]; }); vector <map<int,int>> dp(n); dp[0][n - 1] = 0; auto dfs = [&](auto dfs, int l, int r) -> int{ if ( dp[l].count(r) ){ return dp[l][r]; } int ret = inf, L_ = mn.get(l, r), R_ = mx.get(l, r); if ( R[R_] > r ){ chmin(ret, dfs(dfs, min(L[R_], l), R[R_]) + 1); } if ( L[L_] < l ){ chmin(ret, dfs(dfs, L[L_], max(r, R[L_])) + 1); } return dp[l][r] = min(seg.get(l, r), ret); }; vector <int> ans(n); for ( auto &i: p ){ ans[i] = dfs(dfs, L[i], R[i]) + 1; seg.upd(i, ans[i]); } int q; cin >> q; while ( q-- ){ int x; cin >> x; --x; cout << (ans[x] >= inf ? -1 : ans[x]) << ln; } cout << '\n'; }

Compilation message (stderr)

passport.cpp:37:12: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   37 |     Sparse(auto &a, int s){
      |            ^~~~
passport.cpp: In instantiation of 'Sparse::Sparse(auto:23&, long long int) [with auto:23 = std::vector<long long int>]':
passport.cpp:115:19:   required from here
passport.cpp:47:28: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   47 |             int k = 1 << i - 1;
      |                          ~~^~~
#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...