#include <bits/stdc++.h>
using namespace std;
int a[100005], b[100005];
int pos[100005];
int aib[100005];
int dp[5005][5005];
int rmq[17][100005];
int e[100005];
int n;
void updateAIB(int p, int x)
{
p = n + 2 - p;
for(; p<=n+3; p+=(p&-p))
aib[p] += x;
}
int queryAIB(int p)
{
p = n + 2 - p;
int res = 0;
for(; p; p^=(p&-p))
res += aib[p];
return res;
}
inline int query(const int &a, const int &b)
{
return max(rmq[e[b-a+1]][a], rmq[e[b-a+1]][b + 1 - (1<<e[b-a+1])]);
}
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];
rmq[0][i] = a[i];
pos[a[i]] = i;
}
for(int i=1; i<=n; ++i) cin>>b[i];
for(int i=1; i<17; ++i)
for(int j=1; j+(1<<i)-1 <= n; ++j)
rmq[i][j] = max(rmq[i-1][j], rmq[i-1][j+(1<<i-1)]);
for(int i=2; i<=n; ++i)
e[i] = e[i-1] + ((i & (i-1)) == 0);
if(n <= 5000)
{
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
{
dp[i][j] = dp[i][j-1];
if(a[j] == query(min(i,j), max(i,j)))
dp[i][j] = max(dp[i][j], dp[i-1][j] + (a[j] == b[i]));
}
}
cout<<dp[n][n];
}
else
{
for(int i=1; i<=n; ++i)
{
int j = pos[b[i]];
if(!j) continue;
if(a[j] != query(min(i,j), max(i,j)))
continue;
updateAIB(n, 1);
updateAIB(j-1, -1);
}
cout<<queryAIB(n);
}
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... |