/*
TASK:round
LANG:C++
*/

#include <stdio.h>

#define maxN 1000

int F[maxN+1][maxN+1],N;
int Ra[maxN+1],Rb[maxN+1];
int OpA[maxN+1][maxN+1],SimA[maxN+1];
int OpB[maxN+1][maxN+1],SimB[maxN+1];

void init();
void predprocess();
void solve();
int conflict(int fst,int snd,int door);

int main()
{
 init();
 predprocess();
 solve();
 printf("%d\n",F[N][N]);
 return 0;
}

void init()
{
 scanf("%d",&N);
 int bci;
 for (bci=1;bci<=N;bci++) scanf("%d",&Ra[bci]);
 for (bci=1;bci<=N;bci++) scanf("%d",&Rb[bci]);
}

void predprocess()
{
 int i,j,k,res;
 for (i=1;i<=N;i++)
    for (j=0;j<=N;j++) OpA[i][j]=OpA[i][j-1]+conflict(Ra[i],Rb[j],0)*(j!=0);
 for (i=1;i<=N;i++)
    for (j=0;j<=N;j++) OpB[i][j]=OpB[i][j-1]+conflict(Rb[i],Ra[j],1)*(j!=0);
 for (i=1;i<=N;i++)
    for (j=1;j<i;j++) SimA[i]+=conflict(Ra[i],Ra[j],0);
 for (i=1;i<=N;i++)
    for (j=1;j<i;j++) SimB[i]+=conflict(Rb[i],Rb[j],1);
}

int conflict(int fst,int snd,int door)
{
 if (!door) {
     if (fst>snd) return 1;
     return 0; }
 if (fst>N) {
     if (fst>snd&&snd>N) return 1;
     return 0; }
 if (fst<snd&&snd<=N) return 0;
 return 1;
}

void solve()
{
 int min,can,i,j;
 for (i=0;i<=N;i++)
    for (j=0;j<=N;j++) {
	min=10000;
	if (i) {
	    can=F[i-1][j]+OpA[i][j]+SimA[i];
	    if (can<min) min=can;
	    can=F[i-1][j]+(j-OpA[i][j])+(i-1-SimA[i]);
	    if (can<min) min=can; }
	if (j) {
	    can=F[i][j-1]+OpB[j][i]+SimB[j];
	    if (can<min) min=can;
	    can=F[j-1][i]+(i-OpB[j][i])+(j-1-SimB[j]);
	    if (can<min) min=can; }
	if (min==10000) F[i][j]=0; else F[i][j]=min; }
}