#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define pii pair<int,int>
#define piii pair<int,pii>
#define sp " "
#define nl "\n"
#define all(x) x.begin(),x.end()
#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);
#define ll long long
#define int ll
 
using namespace std;
 
constexpr int N = 2e5+5;
constexpr int INF = 1e9+5;
constexpr int mod = 1e9+7;

int n,ans,st[N];

void update(int x,int val){
    for(x++;x<=n;x+=x&-x)
        st[x]+=val;
}

int get(int x){
    int res=0;
    for(x++;x>0;x-=x&-x)
        res+=st[x];
    return res;
}

signed main(){
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    fastio()
    cin >> n;
    vector<pii> a(n),b(n);
    for(int i=0;i<n;i++){
        int x;
        cin >> x;
        a[i].ff=x+i;
        a[i].ss=i;
    }
    for(int i=0;i<n;i++){
        int x;
        cin >> x;
        b[i].ff=x+i;
        b[i].ss=i;
    }
    sort(all(a));
    sort(all(b));
    vector<int> s(n);
    for(int i=0;i<n;i++){
        if(a[i].ff!=b[i].ff){
            cout << -1 << nl;
            return 0;
        }
        s[a[i].ss]=b[i].ss;
    }
    for(int i=n-1;i>=0;i--){
        ans+=get(s[i]);
        update(s[i],1);
    }
    cout << ans << nl;
}
#include<bits/stdc++.h>
#include<vector>
#include<math.h>
#include<string>
using namespace std;
#define MOD 998244353
#define MAX 200005
#define PMAX 18
#define PRECISION 0.000001
#define INF 1000000000000000000
#define FASTIO ios_base::sync_with_stdio(false);cin.tie(NULL)
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
vector<int> pos[MAX*2][2];
int arr[MAX][2];
int permut[MAX];
map<int,int> M;
int segment_tree[MAX*4];
void update(int index,int l,int r,int ind)
{
    if(l>ind||r<ind) return;
    if(l==r)
    {
        segment_tree[index]=1;
        return;
    }
    int m=(l+r)/2;
    update(index*2,l,m,ind);
    update(index*2+1,m+1,r,ind);
    segment_tree[index]=segment_tree[index*2]+segment_tree[index*2+1];
}
int query(int index,int l,int r,int L,int R)
{
    if(l>R||r<L) return 0;
    if(L<=l&&r<=R)
    {
        return segment_tree[index];
    }
    int m=(l+r)/2;
    return query(index*2,l,m,L,R)+query(index*2+1,m+1,r,L,R);
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(j=0;j<2;j++)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&arr[i][j]);
        }
        for(i=0;i<n-1-i;i++)
        {
            swap(arr[i][j],arr[n-1-i][j]);
        }
    }
    for(j=0;j<2;j++)
    {
        for(i=0;i<n;i++)
        {
            int ss=M.size();
            if(!M.count(arr[i][j]-i))
            {
                M[arr[i][j]-i]=ss;
                ss++;
            }
            pos[M[arr[i][j]-i]][j].push_back(i);
        }
        //M.clear();
    }
    for(i=0;i<MAX;i++)
    {
        int a=pos[i][0].size(),b=pos[i][1].size();
        if(a!=b)
        {
            printf("-1");
            return 0;
        }
        for(j=0;j<pos[i][0].size();j++)
        {
            permut[pos[i][1][j]]=pos[i][0][j];
            //printf("%d<-%d\n",pos[i][1][j],pos[i][0][j]);
        }
    }
    long long ans=0;
    for(i=0;i<n;i++)
    {
        //printf("%d ",permut[i]);
        if(permut[i]<n-1)
        {
            ans=ans+query(1,0,n-1,permut[i]+1,n-1);
        }
        update(1,0,n-1,permut[i]);
    }
    //printf("\n");
    printf("%lld",ans);
    return 0;
}
