Submission #876493

#TimeUsernameProblemLanguageResultExecution timeMemory
876493LucaIliePassport (JOI23_passport)C++17
40 / 100
2037 ms10952 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 2e5; const int INF = 1e9; int l[MAX_N + 1], r[MAX_N + 1], maxR[MAX_N + 1], maxPrefR[MAX_N + 1], dist1[MAX_N + 1], distN[MAX_N + 1]; int n; 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; for ( int j = 1; j <= n; j++ ) { if ( l[j] <= i && i <= r[j] ) { 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] } ); } } } } dist1[1] = 1; maxR[1] = r[1]; } void calc_distN() { for ( int i = n - 1; i >= 0; i-- ) distN[i] = INF; for ( int i = 1; i <= n; i++ ) maxPrefR[i] = max( maxPrefR[i - 1], r[i] ); distN[n] = 0; for ( int i = n - 1; i >= 1; i-- ) distN[i] = distN[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]; calc_dist1(); calc_distN(); /* for ( int i = 1; i <= n; i++ ) cerr << dist1[i] << " "; cerr << "\n"; for ( int i = 1; i <= n; i++ ) cerr << distN[i] << " "; cerr << "\n";*/ cin >> q; while ( q-- ) { int x; cin >> x; int ans = dist1[x] + distN[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...