#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pb push_back
const int N=1e5+5,MAXA=1e6+5,inf=1e9,MOD=1e9+7;
int n,a[N],b[N],lft[N],rt[N],dp[N],dp2[N],suff[5005][5005],lst[N],seen[N];
vector<int> posb[N],posa[N];
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
deque<pair<int,int>> dq={{inf,0}};
set<int> comp;
for(int i=1;i<=n;i++){
cin>>a[i];
comp.insert(a[i]);
}
for(int i=1;i<=n;i++)cin>>b[i];
map<int,int> id;
int cnt=1;
for(auto i:comp)id[i]=cnt++;
for(int i=1;i<=n;i++){
a[i]=id[a[i]];
while(a[i]>=dq.back().first)dq.pop_back();
lft[i]=dq.back().second+1;
dq.pb({a[i],i});
posa[a[i]].pb(i);
}
dq={{inf,n+1}};
for(int i=n;i>0;i--){
while(a[i]>=dq.front().first)dq.pop_front();
rt[i]=dq.front().second-1;
dq.push_front({a[i],i});
}
for(int i=1;i<=n;i++){
b[i]=id[b[i]];
seen[a[i]]=i;
lst[i]=seen[b[i]];
posb[b[i]].pb(i);
}
for(int i=n;i>0;i--){
suff[b[i]][i]++;
for(int j=1;j<=n;j++)suff[j][i]+=suff[j][i+1];
}
/*
* dp[j]=max(dp[j],dp[k]+#of matches of a[i] from (k+1 to j)
* #of matches from k+1 to j = suff[a[i]][k+1]-suff[a[i]][j+1]
* dp[k]+suff[a[i]][k+1]-suff[a[i]][j+1]
* maximize dp[k]+suff[a[i]][k+1]
*/
for(int i=1;i<=n;i++){
int mx=-inf,last=lst[i];
for(int j=lft[i];j<i;j++){
mx=max(mx,dp[j-1]+suff[a[i]][j]);
dp[j]=max(dp[j],mx-suff[a[i]][j+1]);
}
dp[i]=dp[i-1]+(a[i]==b[i]);
if(last!=0 && rt[last]>=i){
dp2[i]=dp[last-1]+suff[b[i]][last]-suff[b[i]][i+1];
for(int j=last;j<i;j++){
if(b[j]>b[i])dp2[i]=max(dp2[i],dp2[j]+suff[b[i]][j+1]-suff[b[i]][i+1]);
// if(i==n)cout<<dp2[i]<<' '<<suff[b[i]][j+1]<<' '<<suff[b[i]][i+1]<<' '<<dp2[j]<<' '<<j<<endl;
}
}
dp[i]=max(dp[i],dp2[i]);
// if(i==n)cout<<dp2[i]<<endl;
}
cout<<dp[n];
}
| # | 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... |