Problem:
Score : 700 points

Problem Statement

We have N cards numbered 1, 2, ..., N.
Card i (1 \leq i \leq N) has an integer A_i written in red ink on one side and an integer B_i written in blue ink on the other side.
Initially, these cards are arranged from left to right in the order from Card 1 to Card N, with the red numbers facing up.

Determine whether it is possible to have a non-decreasing sequence facing up from left to right (that is, for each i (1 \leq i \leq N - 1), the integer facing up on the (i+1)-th card from the left is not less than the integer facing up on the i-th card from the left) by repeating the operation below. If the answer is yes, find the minimum number of operations required to achieve it.

Choose an integer i (1 \leq i \leq N - 1).
Swap the i-th and (i+1)-th cards from the left, then flip these two cards.

Constraints

1 \leq N \leq 18

1 \leq A_i, B_i \leq 50 (1 \leq i \leq N)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N

Output

If it is impossible to have a non-decreasing sequence, print -1.
If it is possible, print the minimum number of operations required to achieve it.

Sample Input 1

3
3 4 3
3 2 3

Sample Output 1

1

By doing the operation once with i = 1, we have a sequence [2, 3, 3] facing up, which is non-decreasing.

Sample Input 2

2
2 1
1 2

Sample Output 2

-1

After any number of operations, we have the sequence [2, 1] facing up, which is not non-decreasing.

Sample Input 3

4
1 2 3 4
5 6 7 8

Sample Output 3

0

No operation may be required.

Sample Input 4

5
28 15 22 43 31
20 22 43 33 32

Sample Output 4

-1

Sample Input 5

5
4 46 6 38 43
33 15 18 27 37

Sample Output 5

3

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(ll i = 0;i < n;i++)
#define ll long long
#define MOD 1000000007
using vi = vector<ll>; // intの1次元の型に vi という別名をつける
using vvi = vector<vi>; // intの2次元の型に vvi という別名をつける

ll n,k,x,y;



class Bit
{
  public:
  ll size;
  vector<ll> data;
  Bit(ll n)
  {
    data.resize(n);
    //REP(i,n)
    //  data[i]=0;
    size=n;
  }
  //(1-i)までの合計を返す
  ll Sum(ll i){
    ll s = 0;
    while (i > 0){
        s += data[i];
        i -= i & -i;
    }
    return s;
  }
  //Add
  void Add(ll i,ll x){
    while (i <= size){
      data[i] += x;
      i += i & -i;
    }
  }
};

/*
  SegTree segtree(n);*/



int bbit(int ii,int t){
  return (ii>>t)%2;
}

//vi ki(18);
//vi gu(18);
vector<int> nmn(18);
vector<pair<int, int>> nm(18);
vector<pair<int, int>> ki(18);
vector<pair<int, int>> gu(18);
//vector<pair<int, int>> ki(18);


int solve(vector<int> &v,vi &a,vi &b)
{
  int wki=0;
  int wgu=0;
  for(int i=0;i<n;i++){
    if ((v[i]+i%2)%2==0){
      if (v[i]==0){
        gu[wgu].first=a[i];
        nmn[i]=a[i];
      }else{
        gu[wgu].first=b[i];
        nmn[i]=b[i];
      }
      gu[wgu].second=i;
      wgu++;
      
    }else{
      if (v[i]==1){
        ki[wki].first=b[i];
        nmn[i]=b[i];
      }else{
        ki[wki].first=a[i];
        nmn[i]=a[i];
      }
      ki[wki].second=i;
      wki++;
    }
  }
  if (wki!=(n/2)) 
    return -1;



  int an=0;
  
  sort(gu.begin(), gu.begin()+wgu);
  sort(ki.begin(), ki.begin()+wki);
  int tmp=0,flag=0,ttmp=0;
  for(int i=0;i<n;i++){
    if (i%2==0){
      if (tmp>gu[i/2].first)flag=1;
      tmp=gu[i/2].first;
      ttmp=gu[i/2].second;
    }else{
      if (tmp>ki[i/2].first)flag=1;
      tmp=ki[i/2].first;
      ttmp=ki[i/2].second;
    }
    nm[i].first=tmp;
    nm[i].second=ttmp;
  }
  if (flag==1)return -1;
  

  Bit bit(64);
  for(int i=0;i<n;i++){
    an+=i-bit.Sum(nmn[i]);
    bit.Add(nmn[i],1);
  }
  
  


  /*
  REP(i,n){
    tmp=nm[i].first;

    for(int j=0;j<n;j++){
      if (nmn[j]==tmp){
        //an+=j-i;
        //an+=nm[i].second-i;
        //cout<<"!>"<<j<<"!"<<i<<"<!";
        for(int k=j-1;k>=0;k--){
          nmn[k+1]=nmn[k];
        }
        nmn[0]=-1;
        break;
      }
    }

  }
  */
 /*
  REP(i,n){
    an+=nm[i].second-i;
    for(int j=i+1;j<n;j++){
      if (nm[j].second<nm[i].second)nm[j].second++;
    }
  }
*/
  /*
  REP(i,n){
    cout<<nm[i].first<<" ";
  }
  cout<<"    "<<an<<endl;
  */


  return an;
}


int main(){
  int ans=(1<<19)+1;
  cin >> n ;
  vi a(n),b(n);
  REP(i,n){
    cin>>a[i];
  }
  
  REP(i,n){
    cin>>b[i];
  }
  



  ll nn=1<<n;
  vector<int> v(n);
  int sm=0;
  int tmpans=0;
  //裏が1
  for(int i=0;i<nn;i++){
    sm=0;
    for(int j=0;j<n;j++){
      v[j]=bbit(i,j);
      sm+=v[j];
    }
    if (sm%2==1)continue;


    tmpans=solve(v,a,b);
    if (tmpans!=-1){
      ans=min(ans,tmpans);
    }
  }



  if (ans!=((1<<19)+1)){
    cout<<ans<<endl;
  }else{
    cout<<-1<<endl;
  }
  
  return 0;
}