Submission #888843

#TimeUsernameProblemLanguageResultExecution timeMemory
888843thunoproPassport (JOI23_passport)C++14
46 / 100
117 ms101716 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] ;

void sub1 () 
{
	priority_queue <int> S ; 
	for ( int i = 1 ; i <= a [1].se ; i ++ ) S.push(a[i].se) ; 
	int res = 1 ; 
	int cur = a[1].se ; 
	while ( !S.empty () ) 
	{
		int u = S.top() ; S.pop() ; 
		if ( cur >= u ) break ; 
		while ( cur < u ) S . push (a[++cur].se) ; 
		res ++ ; 
	}
	if ( cur >= n ) cout << res ; 
	else cout << -1 ; 
} 

int dp [3009][3009] ; 
void sub2 () 
{
	int pos ; 
	for ( int i = 1 ; i <= n ; i ++ ) if ( is_query [i] ) pos = i ; 
	memset ( dp , 0x3f , sizeof dp ) ; 
	
	dp [pos][pos] = 0 ; 
	for ( int len = 0 ; len <= n-1 ; len ++ )
	{
		for ( int l = 1 ; l <= n ; l ++ ) 
		{
			int r = l + len ; 
			if ( r > n ) break ; 
			if ( dp [l][r] > 1e9 ) continue ; 
			for ( int i = l ; i <= r ; i ++ ) 
			{
				chkmin (dp[min(l,a[i].fi)][max(r,a[i].se)],dp[l][r]+1) ; 
			}
		}
	}

	if ( dp [1][n] > 1e9 ) dp [1][n] = - 1 ; 
	cout << dp [1][n] ; 
}

int range [3009][3009][2] ; 
void sub3 () 
{
	int pos ; 
	for ( int i = 1 ; i <= n ; i ++ ) if ( is_query [i] ) pos = i ; 
	memset ( dp , 0x3f , sizeof dp ) ; 
	dp [pos][pos] = 0 ; 
	
	deque <pii> q ; 
	q . push_back ({pos,pos}) ; 
	
	for ( int i = 1 ; i <= n ; i ++ ) for ( int j = i ; j <= n ; j ++ ) 
	{
		if ( i == j ) range [i][j][0] = INF , range [i][j][1] = - INF ; 
		
		if ( j > i ) range [i][j][0] = range [i][j-1][0] ; 
		chkmin (range[i][j][0],a[j].fi) ; 
		if ( j > i ) range [i][j][1] = range [i][j-1][1] ; 
		chkmax (range[i][j][1],a[j].se) ; 
	}
	
	while ( !q.empty() ) 
	{
		int l = q.front().fi , r = q.front().se ; 
		q.pop_front() ; 
		// state 1 : chosse left 
		int L = range [l][r][0] , R = r ; 
		if ( dp [L][R] > dp [l][r] + 1 ) q . push_back ({L,R}) , dp [L][R] = dp [l][r] + 1 ; 
		// state 2 : chosse right 
		L = l , R = range [l][r][1] ; 
		if ( dp [L][R] > dp [l][r] + 1 ) q . push_back ({L,R}) , dp [L][R] = dp [l][r] + 1 ; 
		// state 3 : in mid 
		if ( l == r ) 
		{
			L = a [l].fi , R = a[l].se ; 	
			if ( dp [L][R] > dp [l][r] + 1 ) q . push_back ({L,R}) , dp [L][R] = dp [l][r] + 1 ; 
		}
		else 
		{
			L = l + 1 , R = r ; 
			if ( dp [L][R] > dp [l][r]  ) q . push_front ({L,R}) , dp [L][R] = dp [l][r] ; 
			L = l , R = r - 1 ; 
			if ( dp [L][R] > dp [l][r]  ) q . push_front ({L,R}) , dp [L][R] = dp [l][r] ; 
		}
	}
	
	if ( dp [1][n] > INF ) dp [1][n] = - 1 ;
	cout << dp [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 ++ ) cin >> a [i].fi >> a[i].se ; 
	
	int nq ; cin >> nq ; 
	for ( int i = 1 ; i <= nq ; i ++ ) 
	{
		int x ; cin >> x ; 
		is_query [x] = true ; 
	}
	
	if ( nq == 1 && is_query [1] == true ) sub1 () ; 
	else if ( nq == 1 && n <= 300 ) sub2 () ;
	else if ( nq == 1 && n <= 2500 ) sub3 () ;  
	else if ( n <= 2500 ) sub3 () ; 
}

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) ;
      |  ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
passport.cpp: In function 'void sub2()':
passport.cpp:67:16: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   67 |  dp [pos][pos] = 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...