#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 7;
const long long INF = 1e18;
const long long NOK = 1e17;
long long tr[3 * MAXN];
long long lazy[3 * MAXN];
void propagate(int u, int l, int r) {
  if (lazy[u]) {
    tr[u] += lazy[u];
    if (l != r) {
      lazy[u * 2] += lazy[u];
      lazy[u * 2 + 1] += lazy[u];
    }
    lazy[u] = 0;
  }
}
void build(int u, int l, int r) {
  lazy[u] = 0;
  if (l == r) {
    tr[u] = INF;
    return;
  }
  int mid = (l + r) / 2;
  build(u * 2, l, mid);
  build(u * 2 + 1, mid + 1, r);
  tr[u] = min(tr[u * 2], tr[u * 2 + 1]);
}
void update(int u, int l, int r, int x, int y, long long v) {
  propagate(u, l, r);
  if (r < x || y < l) return;
  if (x <= l && r <= y) {
    lazy[u] += v;
    propagate(u, l, r);
    return;
  }
  int mid = (l + r) / 2;
  update(u * 2, l, mid, x, y, v);
  update(u * 2 + 1, mid + 1, r, x, y, v);
  tr[u] = min(tr[u * 2], tr[u * 2 + 1]);
}
void color(int u, int l, int r, int idx, long long v) {
  propagate(u, l, r);
  if (r < idx || idx < l) return;
  if (l == r) {
    tr[u] = v;
    return;
  }
  int mid = (l + r) / 2;
  color(u * 2, l, mid, idx, v);
  color(u * 2 + 1, mid + 1, r, idx, v);
  tr[u] = min(tr[u * 2], tr[u * 2 + 1]);
}
long long query(int u, int l, int r, int x, int y) {
  propagate(u, l, r);
  if (x <= l && r <= y) return tr[u];
  int mid = (l + r) / 2;
  if (y <= mid) return query(u * 2, l, mid, x, y);
  if (mid < x) return query(u * 2 + 1, mid + 1, r, x, y);
  return min(query(u * 2, l, mid, x, y), query(u * 2 + 1, mid + 1, r, x, y));
}
struct PrefixBIT {
  long long ar[MAXN];
  void add(int idx, long long v) {
    assert(idx != 0);
    while (idx < MAXN) {
      ar[idx] += v;
      idx += idx & (-idx);
    }
  }
  long long query(int idx) {
    long long ans = 0;
    while (idx > 0) {
      ans += ar[idx];
      idx -= idx & (-idx);
    }
    return ans;
  }
} suffixFenwick;
vector<int> oc[MAXN];
int a[MAXN], b[MAXN];
long long p[MAXN], cup[MAXN];
void impossible() {
  cout << "NO\n";
  exit(0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    oc[a[i]].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
    cup[i] = p[i] + cup[i - 1];
    suffixFenwick.add(i, p[i]);
  }
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) cin >> b[i];
  if (oc[b[1]].empty()) impossible();
  build(1, 1, n);
  vector<long long> dp;
  for (int i : oc[b[1]]) {
    color(1, 1, n, i, cup[i - 1]);
    dp.push_back(cup[i - 1]);
  }
  int x = 0;
  for (int k = 2; k <= m; k++) {
    if (tr[1] > NOK) impossible();
    int _p = oc[b[k - 1]].size();
    int _q = oc[b[k]].size();
    while (x < b[k - 1]) {
      x++;
      for (int i : oc[x]) {
        if (p[i] > 0) suffixFenwick.add(i, -p[i]);
      }
    }
    dp.clear();
    for (int _i = 0, _j = -1; _i < _q; _i++) {
      int i = oc[b[k]][_i];
      while (_j + 1 < _p && oc[b[k - 1]][_j + 1] < i) {
        if (_j != -1) {
          int L = oc[b[k - 1]][_j];
          int R = oc[b[k - 1]][_j + 1];
          long long add = suffixFenwick.query(R) - suffixFenwick.query(L);
          update(1, 1, n, 1, L, add);
        }
        _j++;
      }
      long long q = query(1, 1, n, 1, i);
      if (q <= NOK) {
        dp.push_back(q);
        assert(_j != -1);
        int L = oc[b[k - 1]][_j];
        assert(L < i);
        dp.back() += suffixFenwick.query(i - 1) - suffixFenwick.query(L);
      } else {
        dp.push_back(INF);
      }
    }
    for (int j : oc[b[k - 1]]) color(1, 1, n, j, INF);
    for (int _i = 0; _i < _q; _i++) {
      color(1, 1, n, oc[b[k]][_i], dp[_i]);
    }
  }
  if (tr[1] > NOK) impossible();
  while (x < b[m]) {
    x++;
    for (int i : oc[x]) {
      if (p[i] > 0) suffixFenwick.add(i, -p[i]);
    }
  }
  for (int _i = 0; _i < oc[b[m]].size(); _i++) {
    int i = oc[b[m]][_i];
    dp[_i] += suffixFenwick.query(n) - suffixFenwick.query(i);
  }
  int idx = min_element(dp.begin(), dp.end()) - dp.begin();
  cout << "YES\n";
  cout << dp[idx] << "\n";
  return 0;
}
