Submission #876548

#TimeUsernameProblemLanguageResultExecution timeMemory
876548LucaIliePassport (JOI23_passport)C++17
48 / 100
2093 ms370372 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 2e5 + 10; const int INF = 1e9; int l[MAX_N + 1], r[MAX_N + 1], minL[MAX_N + 1], maxR[MAX_N + 1], minSufL[MAX_N + 1], maxPrefR[MAX_N + 1], dist1[MAX_N + 1], distN[MAX_N + 1], dist1R[MAX_N + 1], distNR[MAX_N + 1]; int n; struct AINT { struct px { int p, x; bool operator < ( const px &a ) const { if ( x == a.x ) return p < a.p; return x < a.x; } }; set<px> aint[4 * MAX_N]; void insert( int v, int l, int r, int p, int x, int y ) { if ( l > x || r < x ) return; aint[v].insert( { p, y } ); if ( l == r ) return; int mid = (l + r) / 2; insert( v * 2 + 1, l, mid, p, x, y ); insert( v * 2 + 2, mid + 1, r, p, x, y ); } void erase( int v, int l, int r, int p, int x, int y ) { if ( l > x || r < x ) return; aint[v].erase( { p, y } ); if ( l == r ) return; int mid = (l + r) / 2; erase( v * 2 + 1, l, mid, p, x, y ); erase( v * 2 + 2, mid + 1, r, p, x, y ); } px query( int v, int l, int r, int lq, int rq ) { if ( l > rq || r < lq || aint[v].empty() ) return { 0, 0 }; if ( lq <= l && r <= rq ) return *aint[v].rbegin(); int mid = (l + r) / 2; return max( query( v * 2 + 1, l, mid, lq, rq ), query( v * 2 + 2, mid + 1, r, lq, rq ) ); } } aint1, aintN; void calc_dist1() { struct dr { int i, dist, maxR; bool operator < ( const dr &x ) const { if ( dist == x.dist ) return maxR < x.maxR; return dist > x.dist; } }; for ( int i = 0; i <= n; i++ ) dist1[i] = INF, maxR[i] = 0; priority_queue<dr> pq; dist1[1] = 0; maxR[1] = 0; pq.push( { 1, dist1[1], maxR[1] } ); while ( !pq.empty() ) { auto crt = pq.top(); pq.pop(); int i = crt.i; if ( crt.dist != dist1[i] || crt.maxR != maxR[i] ) continue; auto a = aint1.query( 0, 1, n, 1, i ); while ( a.x >= i ) { int j = a.p; if ( dist1[i] + 1 <= dist1[j] && max( maxR[i], r[j] ) > maxR[j] ) { dist1[j] = dist1[i] + 1; maxR[j] = max( maxR[i], r[j] ); pq.push( { j, dist1[j], maxR[j] } ); } aint1.erase( 0, 1, n, j, l[j], r[j] ); a = aint1.query( 0, 1, n, 1, i ); } } dist1[1] = 1; maxR[1] = r[1]; } void calc_distN() { struct dr { int i, dist, minL; bool operator < ( const dr &x ) const { if ( dist == x.dist ) return minL > x.minL; return dist > x.dist; } }; for ( int i = 0; i <= n; i++ ) distN[i] = INF, minL[i] = n + 1; priority_queue<dr> pq; distN[n] = 0; minL[n] = n + 1; pq.push( { n, distN[n], minL[n] } ); while ( !pq.empty() ) { auto crt = pq.top(); pq.pop(); int i = crt.i; if ( crt.dist != distN[i] || crt.minL != minL[i] ) continue; auto a = aintN.query( 0, 1, n, 1, i ); while ( a.x >= i ) { int j = a.p; if ( distN[i] + 1 <= distN[j] && min( minL[i], l[j] ) < minL[j] ) { distN[j] = distN[i] + 1; minL[j] = min( minL[i], l[j] ); pq.push( { j, distN[j], minL[j] } ); } aintN.erase( 0, 1, n, j, l[j], r[j] ); a = aintN.query( 0, 1, n, 1, i ); } } distN[n] = 1; minL[n] = r[n]; } void calc_dist1_rest() { for ( int i = 0; i <= n; i++ ) dist1R[i] = INF; minSufL[n] = l[n]; for ( int i = n - 1; i >= 1; i-- ) minSufL[i] = min( minSufL[i + 1], l[i] ); dist1R[1] = 0; for ( int i = 2; i <= n; i++ ) dist1R[i] = dist1R[minSufL[i]] + 1; } void calc_distN_rest() { for ( int i = n - 1; i >= 0; i-- ) distNR[i] = INF; for ( int i = 1; i <= n; i++ ) maxPrefR[i] = max( maxPrefR[i - 1], r[i] ); distNR[n] = 0; for ( int i = n - 1; i >= 1; i-- ) distNR[i] = distNR[maxPrefR[i]] + 1; } int main() { ios_base::sync_with_stdio( false ); cin.tie( NULL ); cout.tie( NULL ); int q; cin >> n; for ( int i = 1; i <= n; i++ ) { cin >> l[i] >> r[i]; aint1.insert( 0, 1, n, i, l[i], r[i] ); aintN.insert( 0, 1, n, i, l[i], r[i] ); } if ( n <= 2500 ) { calc_dist1(); calc_distN(); calc_dist1_rest(); calc_distN_rest(); } cin >> q; while ( q-- ) { int x; cin >> x; int ans = min( distN[x] + dist1R[minL[x]], dist1[x] + distNR[maxR[x]] ); cout << (ans > n ? -1 : ans) << "\n"; } return 0; }
#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...