#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T& x) {
  x = 0;
  T f = 1;
  char ch = getchar();
  while (!isdigit(ch)) f = (ch == '-') ? -1 : 1, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
  x *= f;
}
template <typename T, typename... Args>
inline void read(T& x, Args&... args) {
  read(x), read(args...);
}
constexpr long long MAXN = 5e5 + 5, MOD = 1e9 + 7, INF = 1e16;
struct SegTree {
  SegTree *lson, *rson;
  long long l, r;
  long long min, tag;
} tree[MAXN << 1], *root;
long long n, m, tot;
array<long long, MAXN> a, p, b, dp;
inline void build(SegTree*& root, long long l = 0, long long r = m) {
  root = &tree[tot++], root->l = l, root->r = r;
  if (l == r) {
    root->min = (l == 0 ? 0 : INF);
    return;
  }
  long long mid = (l + r) >> 1;
  build(root->lson, l, mid), build(root->rson, mid + 1, r);
}
inline void pushTag(SegTree* root) {
  if (!root->tag) return;
  root->lson->tag += root->tag, root->lson->min += root->tag;
  root->lson->tag = min(INF, root->lson->tag),
  root->lson->min = min(INF, root->lson->min);
  root->rson->tag += root->tag, root->rson->min += root->tag;
  root->rson->min = min(INF, root->rson->min),
  root->rson->tag = min(INF, root->rson->tag);
  root->tag = 0;
}
inline void change(SegTree* root, long long l, long long r, long long val) {
  if (l <= root->l && root->r <= r) {
    root->tag += val, root->min += val;
    root->tag = min(root->tag, INF), root->min = min(root->min, INF);
    return;
  }
  pushTag(root);
  long long mid = (root->l + root->r) >> 1;
  if (l <= mid) change(root->lson, l, r, val);
  if (r > mid) change(root->rson, l, r, val);
}
inline void pointChange(SegTree* root, long long pos, long long val) {
  if (pos == root->l && root->r == pos) {
    root->min = min(root->min, val);
    return;
  }
  long long mid = (root->l + root->r) >> 1;
  if (pos <= mid)
    pointChange(root->lson, pos, val);
  else
    pointChange(root->rson, pos, val);
}
inline long long query(SegTree* root, long long pos) {
  if (pos == root->l && root->r == pos) return root->min;
  pushTag(root);
  long long mid = (root->l + root->r) >> 1;
  if (pos <= mid)
    return query(root->lson, pos);
  else
    return query(root->rson, pos);
}
signed main() {
  read(n);
  for (long long i = 1; i <= n; i++) read(a[i]);
  for (long long i = 1; i <= n; i++) read(p[i]);
  read(m);
  for (long long i = 1; i <= m; i++) read(b[i]);
  b[m + 1] = INF;
  build(root);
  for (long long i = 1; i <= n; i++) {
    long long pos =
        lower_bound(b.begin() + 1, b.begin() + m + 1, a[i]) - b.begin();
    if (b[pos] == a[i]) {
      long long tmp = query(root, pos - 1);
      change(root, pos, pos, min(0LL, p[i]));
      pointChange(root, pos, tmp);
    }
    if (b[pos] > a[i] && pos <= m)
      change(root, pos, m, min(0LL, p[i]));
    else if (b[pos] == a[i] && pos + 1 <= m)
      change(root, pos + 1, m, min(0LL, p[i]));
    change(root, 0, pos - 1, p[i]);
  }
  long long ans = query(root, m);
  if (ans >= INF / 10)
    printf("NO\n");
  else
    printf("YES\n%lld\n", ans);
  return 0;
}
