def main():

  N = int(eval(input()))

  A = list(map(int,input().split()))

  B = list(map(int,input().split()))

  # M:カードの数字の最大値+1

  M = max(max(A),max(B))+1

  INF=float('inf')

  # dp[mask][a]:maskのカードが操作済で、そのうち右端のカードの数字がaであるときの操作回数の最小値

  dp = [[INF for _ in range(M)] for _ in range(1<<N)]

  dp[0][0] = 0

  

  for i in range(1<<N):

    # idx:操作済カードの枚数

    idx = 0

    for k in range(N):

      #k番目のカードが操作済みかどうか判定する。iでk番目にフラグがたってたら、操作済みとする。

      if (i>>k)&1 == 1:

        idx += 1

    for j in range(M):

      if dp[i][j] >= INF:

        continue

      for k in range(N):

        # k:右端の操作済カードの次に来るカード

        # kがすでに操作済の場合はcontinueする

        if (i>>k)&1:

          continue

        

        # kが何回操作されるかによってkの数字が表の数字になるか裏の数字になるかが決まる

        if abs(k-idx)%2 == 0:

          c = A[k]

        else:

          c = B[k]

  

        # kの数字広義単調増加にならない場合はcontinue

        if j > c:

          continue

        

        # t:kを右端の操作済カードの次に並べるための操作回数

        # それは、初期配置でkより左にあってまだ操作済でないカードの枚数と一致する

        t = 0

        for l in range(k):

          if (i>>l)&1 == 0:

            t += 1

        #print(i,k,idx,c,dp[i|(1<<k)][c],t)

        dp[i|(1<<k)][c] = min(dp[i|(1<<k)][c],dp[i][j]+t)

  

  ans = INF

  for i in range(M):

    ans = min(dp[(1<<N)-1][i],ans)

  print((ans if ans < INF else -1))



if __name__ == '__main__':

  main()
N = int(eval(input()))

A = list(map(int,input().split()))

B = list(map(int,input().split()))

INF = N**3

max_ab = max(max(A),max(B))+1

dp = [[INF] * max_ab for _ in range(2**N)]

dp[0][0]=0

for i in range(2**N):

  done = 0

  for j in range(N):

    if (i>>j)&1:

      done += 1

  

  for right_end in range(max_ab):

    if dp[i][right_end]==INF:

      continue

    for add_last in range(N):

      if (i>>add_last)&1:

        continue

      if abs(add_last-done)%2==0:

        add_last_surface = A[add_last]

      else:

        add_last_surface = B[add_last]

        

      if right_end>add_last_surface:

        continue

        

      num = 0

      for k in range(add_last):

        if (i>>k)&1==0:

          num+=1

          

      dp[i|1<<add_last][add_last_surface]=min(dp[i|1<<add_last][add_last_surface],

                                              dp[i][right_end]+num)

      

ans = min(dp[-1])

if ans==INF:

  print((-1))

else:

  print(ans)
def main():
    N = int(eval(input()))
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))
    # M:カードの数字の最大値+1
    M = max(max(A), max(B)) + 1
    INF = float("inf")
    # dp[mask][a]:maskのカードが操作済で、そのうち右端のカードの数字がaであるときの操作回数の最小値
    dp = [[INF for _ in range(M)] for _ in range(1 << N)]
    dp[0][0] = 0
    for i in range(1 << N):
        # idx:操作済カードの枚数
        idx = 0
        for k in range(N):
            # k番目のカードが操作済みかどうか判定する。iでk番目にフラグがたってたら、操作済みとする。
            if (i >> k) & 1 == 1:
                idx += 1
        for j in range(M):
            if dp[i][j] >= INF:
                continue
            for k in range(N):
                # k:右端の操作済カードの次に来るカード
                # kがすでに操作済の場合はcontinueする
                if (i >> k) & 1:
                    continue
                # kが何回操作されるかによってkの数字が表の数字になるか裏の数字になるかが決まる
                if abs(k - idx) % 2 == 0:
                    c = A[k]
                else:
                    c = B[k]
                # kの数字広義単調増加にならない場合はcontinue
                if j > c:
                    continue
                # t:kを右端の操作済カードの次に並べるための操作回数
                # それは、初期配置でkより左にあってまだ操作済でないカードの枚数と一致する
                t = 0
                for l in range(k):
                    if (i >> l) & 1 == 0:
                        t += 1
                # print(i,k,idx,c,dp[i|(1<<k)][c],t)
                dp[i | (1 << k)][c] = min(dp[i | (1 << k)][c], dp[i][j] + t)
    ans = INF
    for i in range(M):
        ans = min(dp[(1 << N) - 1][i], ans)
    print((ans if ans < INF else -1))


if __name__ == "__main__":
    main()

N = int(eval(input()))
A = list(map(int, input().split()))
B = list(map(int, input().split()))
INF = N**3
max_ab = max(max(A), max(B)) + 1
dp = [[INF] * max_ab for _ in range(2**N)]
dp[0][0] = 0
for i in range(2**N):
    done = 0
    for j in range(N):
        if (i >> j) & 1:
            done += 1
    for right_end in range(max_ab):
        if dp[i][right_end] == INF:
            continue
        for add_last in range(N):
            if (i >> add_last) & 1:
                continue
            if abs(add_last - done) % 2 == 0:
                add_last_surface = A[add_last]
            else:
                add_last_surface = B[add_last]
            if right_end > add_last_surface:
                continue
            num = 0
            for k in range(add_last):
                if (i >> k) & 1 == 0:
                    num += 1
            dp[i | 1 << add_last][add_last_surface] = min(
                dp[i | 1 << add_last][add_last_surface], dp[i][right_end] + num
            )
ans = min(dp[-1])
if ans == INF:
    print((-1))
else:
    print(ans)

-def main(): -    N = int(eval(input())) -    A = list(map(int, input().split())) -    B = list(map(int, input().split())) -    # M:カードの数字の最大値+1 -    M = max(max(A), max(B)) + 1 -    INF = float("inf") -    # dp[mask][a]:maskのカードが操作済で、そのうち右端のカードの数字がaであるときの操作回数の最小値 -    dp = [[INF for _ in range(M)] for _ in range(1 << N)] -    dp[0][0] = 0 -    for i in range(1 << N): -        # idx:操作済カードの枚数 -        idx = 0 -        for k in range(N): -            # k番目のカードが操作済みかどうか判定する。iでk番目にフラグがたってたら、操作済みとする。 -            if (i >> k) & 1 == 1: -                idx += 1 -        for j in range(M): -            if dp[i][j] >= INF: +N = int(eval(input())) +A = list(map(int, input().split())) +B = list(map(int, input().split())) +INF = N**3 +max_ab = max(max(A), max(B)) + 1 +dp = [[INF] * max_ab for _ in range(2**N)] +dp[0][0] = 0 +for i in range(2**N): +    done = 0 +    for j in range(N): +        if (i >> j) & 1: +            done += 1 +    for right_end in range(max_ab): +        if dp[i][right_end] == INF: +            continue +        for add_last in range(N): +            if (i >> add_last) & 1: -            for k in range(N): -                # k:右端の操作済カードの次に来るカード -                # kがすでに操作済の場合はcontinueする -                if (i >> k) & 1: -                    continue -                # kが何回操作されるかによってkの数字が表の数字になるか裏の数字になるかが決まる -                if abs(k - idx) % 2 == 0: -                    c = A[k] -                else: -                    c = B[k] -                # kの数字広義単調増加にならない場合はcontinue -                if j > c: -                    continue -                # t:kを右端の操作済カードの次に並べるための操作回数 -                # それは、初期配置でkより左にあってまだ操作済でないカードの枚数と一致する -                t = 0 -                for l in range(k): -                    if (i >> l) & 1 == 0: -                        t += 1 -                # print(i,k,idx,c,dp[i|(1<<k)][c],t) -                dp[i | (1 << k)][c] = min(dp[i | (1 << k)][c], dp[i][j] + t) -    ans = INF -    for i in range(M): -        ans = min(dp[(1 << N) - 1][i], ans) -    print((ans if ans < INF else -1)) - - -if __name__ == "__main__": -    main() +            if abs(add_last - done) % 2 == 0: +                add_last_surface = A[add_last] +            else: +                add_last_surface = B[add_last] +            if right_end > add_last_surface: +                continue +            num = 0 +            for k in range(add_last): +                if (i >> k) & 1 == 0: +                    num += 1 +            dp[i | 1 << add_last][add_last_surface] = min( +                dp[i | 1 << add_last][add_last_surface], dp[i][right_end] + num +            ) +ans = min(dp[-1]) +if ans == INF: +    print((-1)) +else: +    print(ans)