Submission #888954

#TimeUsernameProblemLanguageResultExecution timeMemory
888954thunoproPassport (JOI23_passport)C++14
48 / 100
195 ms89932 KiB
#include<bits/stdc++.h> using namespace std ; #define maxn 200009 #define ll long long #define fi first #define se second #define pb push_back #define left id<<1 #define right id<<1|1 #define re exit(0); const int mod = 1e9+7 ; const int INF = 1e9 ; const int LOG = 18 ; typedef vector<int> vi ; typedef vector<ll> vl ; typedef pair<int,int> pii ; typedef vector<pii> vii ; typedef pair<ll,ll> pll ; void add ( int &a , int b ) { a += b ; if ( a < 0 ) a += mod ; if ( a >= mod ) a -= mod ; } template < typename T > void chkmin (T &a , T b) { if (a>b) a=b ;} template < typename T > void chkmax (T &a , T b) { if (a<b) a=b ;} void rf () { freopen ("bai1.inp","r",stdin) ; // freopen ("bai1.out","w",stdout) ; } int n ; pii a [maxn] ; bool is_query [maxn] ; int d [maxn] ; int dp [maxn][2] ; vi T [maxn*4] ; int pos_segment [maxn] ; void build ( int id , int l , int r ) { if ( l == r ) { pos_segment [l] = id ; return ; } int mid = (l+r)/2 ; build (left,l,mid) ; build (right,mid+1,r) ; } void add_edge ( int id , int l , int r , int u , int v , int E ) { if ( l > v || r < u ) return ; if ( u <= l && r <= v ) { T [id] . pb (E) ; return ; } int mid = (l+r)/2 ; add_edge (left,l,mid,u,v,E) ; add_edge (right,mid+1,r,u,v,E) ; } bool used [maxn] ; struct shape { int u , d ; bool operator < ( const shape &o ) const { return d > o.d ; } }; void bfs () { memset ( used , false , sizeof used ) ; priority_queue <shape> q ; for ( int i = 1 ; i <= n ; i ++ ) if ( d [i] < INF ) q . push ({i,d[i]}) ; while (!q.empty()) { shape t = q.top() ; q.pop() ; int u = t.u ; if ( d[u] != t.d ) continue ; int id = pos_segment [u] ; while ( id ) { if ( used [id] ) break ; used [id] = true ; for ( auto v : T [id] ) { if ( d [v] > d [u] + 1 ) q . push ({v,d[v]=d[u]+1}) ; } id /= 2 ; } } } void sub_AC () { build (1,1,n) ; memset ( d , 0x3f , sizeof d ) ; d [1] = 0 ; bfs () ; for ( int i = 1 ; i <= n ; i ++ ) dp [i][0] = d [i] ; memset ( d , 0x3f , sizeof d ) ; d [n] = 0 ; bfs () ; for ( int i = 1 ; i <= n ; i ++ ) dp [i][1] = d [i] ; dp [1][0] = 1 , dp [n][1] = 1 ; for ( int i = 1 ; i <= n ; i ++ ) d [i] = min (INF,dp[i][0]+dp[i][1]) ; bfs () ; for ( int i = 1 ; i <= n ; i ++ ) { if ( is_query [i] ) { if ( d [i] == INF ) cout << - 1 << "\n" ; else cout << d [i]-1 << "\n" ; } } } int main () { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0) ; // rf () ; cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) { int l , r ; cin >> l >> r ; add_edge (1,1,n,l,r,i) ; } int nq ; cin >> nq ; for ( int i = 1 ; i <= nq ; i ++ ) { int x ; cin >> x ; is_query [x] = true ; } sub_AC () ; }

Compilation message (stderr)

passport.cpp: In function 'void rf()':
passport.cpp:34:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |  freopen ("bai1.inp","r",stdin) ;
      |  ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...