이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
 
#define all(a) a.begin(),a.end()
#define pb push_back
#define int long long
using namespace std ;
 
const int maxn = 5002 , maxq = 1e5+10 , mod = 998244353 ,inf = 1e18 ;
int dp[3][maxn][maxn] , n , a[maxq] , b[maxq] , l[maxq] , r[maxq] , c[maxq] , p[maxq]  ;
stack<int> s , t;
set <int > ff; 
int solve(int n){
	map <int , int > m , q  ;
	int cnt = 1 ;
	for(int i = 1; i <= n ; i++){
		m[a[i]] = cnt ;
		p[cnt] = i ;
		cnt++;
	}
	cnt = 1; 
	vector <int> v , last ;
	last.pb(0);
	for(int i = 1; i <= n ; i++){
		last.pb(inf);
		if(m[b[i]] == 0)continue ;
		int ind = p[m[b[i]]] ;
		if(l[ind] < i && r[ind] > i){
			if(q[b[i]] == 0){
				q[b[i]] = cnt ;
              	cnt++;
            }
			v.pb(m[b[i]]);
		}
	}
	int ans = 0 ;
	for(int i = 0; i < v.size() ; i++){
		int x = upper_bound(all(last) , v[i])- last.begin() - 1;
		last[x+1] = min(last[x+1] , v[i]);
		ans = max(x+1 , ans); 
	}
	return ans ;
}
int solve2(int n){
	int dp[maxq];
	memset(dp , 0 , sizeof dp);
	for(int i =1 ; i <= n ; i++){
		if(a[i] != b[1])continue ;
		dp[l[i]+1]++;
		dp[r[i]]--;
	}
	int ans =0  ;
	for(int i =1; i <= n ; i++){
		dp[i] +=dp[i-1] ;
		if(dp[i] !=0 )ans++;
	}
	return ans ;
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin >>n ;
	for(int i =1 ; i <= n ; i++){
		cin >> a[i];
	}
	for(int i= 1; i <= n ; i++){
		while(s.size() && a[i] >= a[s.top()])s.pop();
		if(s.size() == 0){
			l[i] = 0 ;
		}else{
			l[i] = s.top();
		}
		s.push(i);
	}
	for(int i = n; i >= 1 ; i--){
		while(t.size() && a[i] >= a[t.top()])t.pop();
		if(t.size() == 0){
			r[i] = n+1 ;
		}else{
			r[i] = t.top();
		}
		t.push(i);
	}
	for(int i = 1; i <= n ; i++){
		cin >> b[i] ;
		ff.insert(b[i]);
	//	cout << l[i] << " " << r[i] <<"<-\n";
	}
	if(ff.size() == 1){
		cout << solve2(n) << "\n";
		return 0 ;
	}
	if(n > 5000){
		cout << solve(n) << "\n" ;
		return 0 ;
	}
	for(int i = 1; i <= n ; i++){
		for(int j =1  ; j <= n ; j++){
			dp[0][i][j] = max(dp[0][i-1][j] , dp[1][i-1][j]);
			dp[1][i][j] = max(max(dp[0][i-1][j-1] , dp[1][i-1][j-1])  , dp[1][i][j-1]) + ((j > l[i] && r[i] > j) && a[i] == b[j]) ;
		}
	}
	for(int i = 1; i <= n ; i++){
		for(int j =1 ; j <= n ; j++){
	//		cout << dp[0][i][j]  << " " << dp[1][i][j] << "       ";
		}
	//	cout << "\n";
	}
	cout << max(dp[0][n][n] , dp[1][n][n]) << "\n";
	return 0 ;
}
컴파일 시 표준 에러 (stderr) 메시지
exam.cpp: In function 'long long int solve(long long int)':
exam.cpp:36:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for(int i = 0; i < v.size() ; i++){
      |                 ~~^~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |