#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const long long linf = 4000000000000000000LL;
const long long inf = 998244353;
const long double pi = 3.1415926535;
void pv(vector<int> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<long long> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<vector<int> > a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
    cout << '\n';
  }
}
void pv(vector<vector<long long> > a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
  }
  cout << '\n';
}
void pv(vector<string> a) {
  for (auto& x : a) cout << x << '\n';
  cout << '\n';
}
void setIO(string second) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  if (int(second.size())) {
    freopen((second + ".in").c_str(), "r", stdin);
    if (second != "test1") freopen((second + ".out").c_str(), "w", stdout);
  }
}
class segment_tree {
  struct item {
    long long sum;
  };
  item single(long long i) { return {i}; }
  item merge(item x, item y) {
    item ans;
    ans.sum = x.sum + y.sum;
    return ans;
  }
  vector<item> tree;
  vector<item> A;
  int height;
  item neutral = {0};

 public:
  void build(vector<long long>& B) {
    int n = B.size();
    height = log2(n + 1) + 1;
    A.resize(n);
    tree.resize((1 << height + 1) - 1);
    for (int i = (0); i < (n); ++i) A[i] = single(B[i]);
    A.resize(1 << height, neutral);
    build(A, 0, 0, (1 << height) - 1);
  }
  void build(vector<item>& A, int v, int tl, int tr) {
    if (tl == tr)
      tree[v] = A[tl];
    else {
      int mid = (tl + tr) / 2;
      build(A, 2 * v + 1, tl, mid);
      build(A, 2 * v + 2, mid + 1, tr);
      tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
    }
  }

 public:
  long long query(int l, int r) {
    return query(0, 0, (1 << height) - 1, l, r).sum;
  }
  item query(int v, int tl, int tr, int l, int r) {
    if (r < tl || l > tr) return neutral;
    if (l <= tl && r >= tr) {
      return tree[v];
    }
    int mid = (tl + tr) / 2;
    return merge(query(2 * v + 1, tl, mid, l, r),
                 query(2 * v + 2, mid + 1, tr, l, r));
  }

 public:
  void update(int pos, long long val) {
    update(0, 0, (1 << height) - 1, pos, single(val));
  }
  void update(int v, int tl, int tr, int pos, item val) {
    if (tl == tr) {
      tree[v] = merge(tree[v], val);
    } else {
      int mid = (tl + tr) / 2;
      if (pos <= mid)
        update(2 * v + 1, tl, mid, pos, val);
      else
        update(2 * v + 2, mid + 1, tr, pos, val);
      tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
    }
  }
};
int n, m;
vector<int> a, p, b;
int main() {
  setIO("");
  cin >> n;
  a.resize(n);
  for (auto& x : a) cin >> x;
  p.resize(n);
  for (auto& x : p) cin >> x;
  cin >> m;
  b.resize(m);
  for (auto& x : b) cin >> x;
  vector<long long> dp(n);
  map<int, vector<int> > pos;
  for (int i = (0); i < (n); ++i) pos[a[i]].push_back(i);
  for (auto& x : pos[b[0]]) dp[x] = p[x];
  set<pair<int, int> > t;
  for (int i = (0); i < (n); ++i) t.insert({a[i], i});
  segment_tree sum;
  vector<long long> temp(n);
  sum.build(temp);
  while (int(t.size()) && t.begin()->first <= b[0]) {
    int k = t.begin()->second;
    t.erase(t.begin());
    if (p[k] > 0) sum.update(k, p[k]);
  }
  for (int i = (1); i < (m); ++i) {
    int j = b[i - 1], k = b[i];
    vector<int> todo;
    for (auto& x : pos[j]) todo.push_back(x);
    for (auto& x : pos[k]) todo.push_back(x);
    long long ans = -linf;
    int last = -1;
    sort(todo.begin(), todo.end());
    for (auto& x : todo) {
      ans += sum.query(last + 1, x);
      last = x;
      if (a[x] == j)
        ans = max(ans, dp[x]);
      else
        dp[x] = ans + p[x];
    }
    while (int(t.size()) && t.begin()->first <= k) {
      int l = t.begin()->second;
      t.erase(t.begin());
      if (p[l] > 0) sum.update(l, p[l]);
    }
  }
  long long ans = -linf;
  for (int i = (0); i < (n); ++i)
    if (a[i] == b[m - 1]) ans = max(ans, dp[i] + sum.query(i + 1, n - 1));
  ans = accumulate(p.begin(), p.end(), 0LL) - ans;
  if (ans > 1e15)
    cout << "NO" << '\n';
  else
    cout << "YES" << '\n' << ans << '\n';
}
