#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define rep(a,b) for(int a = 0; a < (b); ++a)
#define all(t) t.begin(), t.end()
#define pb push_back
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
const int N = 505, INF = 2e9+54321;
const ll INF_L = (ll)2e18+54321;
int n;
int A[N], B[N], C[N], D[N];
int odl(int l, int p, int val)
{
	if(l > p or l >= n) return 0;
	int res = 0;
	for(int i = l; i <= p; ++i) if(B[i] == val) ++res;
	return res;
}
void solve()
{
	cin >> n;
	rep(i,n) cin >> A[i];
	rep(i,n) cin >> B[i];
	rep(i,n)
	{
		if(i == 0) C[i] = 0;
		else C[i] = C[i-1];
		int idx = -1, mx = -INF;
		for(int j = i; j >= 0 and mx <= B[i]; --j)
		{
			mx = max(mx,A[j]);
			//cout << "I: " << i << " J: " << j << " IDX: " << idx << endl;
			if(mx == B[i])
			{
				idx = j;
				break;
			}
		}
		//cout << "I: " << i << " IDX: " << idx << endl;
		if(idx != -1)
		{
			map<int,int> M;
			int at = -1;
			for(int j = idx; j >= 0; --j)
			{
				if(A[j] > at) M[A[j]] = j;
				at = max(at,A[j]);
			}
			/*cout << endl << endl;
			cout << "I: " << i << endl;
			for(auto it = M.begin(); it != M.end(); ++it) cout << "VAL: " << it->first << " IDX: " << it->second << endl;
			cout << endl << endl; */
			for(int j = i; j >= idx; --j)
			{
				if(auto it = M.find(B[j]) == M.end()) D[j] = -INF;
				else
				{
					D[j] = 1;
					for(int k = j+1; k <= i; ++k)
					{
						if(A[j] >= A[k]) D[j] = max(D[j],D[k]+1);
					}
				}
			}
			//cout << endl;
			//for(int j = idx; j <= i; ++j) cout << "J: " << j << " D: " << D[j] << endl;
			//cout << endl;
			for(auto it = M.begin(); it != M.end(); ++it)
			{
				for(int j = idx; j <= i; ++j)
				{
					if(it->first >= A[j]) 
					{
						int dod = C[it->second];
						if(it->second == idx)
						{
							if(it->second == 0) dod = 0;
							else dod = C[it->second-1];
						}
						int cost = dod+odl(it->second+1,j-1,it->first)+D[j];
						C[i] = max(C[i],cost);
					}
				}
			}
		}
	}
	//rep(i,n) cout << "I: " << i << " C: " << C[i] << endl;
	cout << C[n-1] << '\n';	
}
int main()
{	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int T = 1;
	//cin >> T;
	while(T--) solve();
	return 0;
}
| # | 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... |