#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],suff[5005][5005];
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]];
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;
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]);
}
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... |