#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(i=0;i<n;i++)
#define Rep(i,x,n) for(i=x;i<=n;i++)
#define all(v) v.begin(),v.end()
#define foreach(c,itr) for(__typeof(c.begin()) itr=c.begin();itr!=c.end();itr++)
#define p_b push_back
#define pii pair<int,int>
#define fr first
#define sc second
#define m_p make_pair
#define zero(a) memset(a,0,sizeof(a))
#define setp setprecision
typedef long long ll;
typedef long double ld;
const ll INF=0x3f3f3f3f;
const ll mod=1000000007;
const ld eps=1e-14;
int i,j;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	string s;
	cin>>s;
	cout<<s.substr(1,s.size()-1)<<s[0]<<endl;
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
using LL=long long;
using P=pair<int,int>;
using T=tuple<LL,int,int,int>;
constexpr LL mod=1000000007;
constexpr LL inf=1e18;
constexpr double eps=1e-13;
constexpr double pi=3.141592653589;
int in(){
    int x;
    scanf("%d",&x);
    return x;
}
struct segtree{
    int N=262144;
    vector<int>data;
    segtree(){
        data.assign(N*2,0/*inf*/);
    }
    segtree(int n){
        N=n;
        data.assign(N*2,0/*inf*/);
    }
    void upd(int l,int r,int n,int nl,int nr,LL x){
        if(l<=nl && nr<=r){
            data[n]+=x;
            return;
        }
        if(r<=nl || nr<=l)return;
        int mid=(nl+nr)/2;
        upd(l,r,n*2,nl,mid,x),upd(l,r,n*2+1,mid,nr,x);
    }
    void update(int l,int r,LL x){upd(l,r,1,0,N,x);}
    LL get(int x){
        LL res=0;
        for(int i=N+x;i;i/=2)res+=data[i];
        return res;
    }
};
int main(){
    int n=in();
    segtree s;
    LL ans=0;
    map<int,vector<int>>m;
    for(int i=0;i<n;i++)m[in()+i].emplace_back(i);
    for(auto &p:m)reverse(p.second.begin(),p.second.end());
    for(int i=0;i<n;i++){
        int x=in()+i;
        if(m[x].size()==0){
            cout<<-1<<endl;
            return 0;
        }
        int pos=m[x].back();
        m[x].pop_back();
        ans+=pos+s.get(pos)-i;
        s.update(0,pos,1);
    }
    cout<<ans<<endl;
}