#include <bits/stdc++.h>
using namespace std;
template <typename T>
T getint() {
  T x = 0, p = 1;
  char ch;
  do {
    ch = getchar();
  } while (ch <= ' ');
  if (ch == '-') p = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * p;
}
template <typename T1, typename T2>
bool umin(T1 &x, const T2 &y) {
  if (x > y) return x = y, true;
  return false;
}
template <typename T1, typename T2>
bool umax(T1 &x, const T2 &y) {
  if (x < y) return x = y, true;
  return false;
}
const int maxn = (int)5e5 + 10;
const int inf = (int)1e9 + 5;
const int mod = 998244353;
const long long llinf = (long long)1e18 + 5;
const double pi = acos(-1.0);
int a[maxn];
int n, m;
int b[maxn];
int p[maxn];
long long dp[maxn];
vector<int> idx[maxn];
long long get(int l, int r, int val) {
  long long ret = 0;
  for (int i = l; i <= r; ++i) {
    if (a[i] >= val) {
      ret += p[i];
    }
  }
  return ret;
}
long long get2(int l, int r, int val) {
  long long ret = 0;
  for (int i = l; i <= r; ++i) {
    if (a[i] <= val && p[i] < 0) {
      ret += p[i];
    }
  }
  return ret;
}
long long fw[maxn];
long long fw2[maxn];
void addfw(long long fw[maxn], int x, long long val) {
  for (; x < maxn; x |= x + 1) {
    fw[x] += val;
  }
}
long long get(long long fw[maxn], int r) {
  long long ret = 0;
  for (; r >= 0; r = (r & (r + 1)) - 1) {
    ret += fw[r];
  }
  return ret;
}
long long get(long long fw[maxn], int l, int r) {
  if (l > r) return 0;
  return get(fw, r) - get(fw, l - 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for (int i = 1; i <= n; ++i) {
    cin >> p[i];
  }
  a[n + 1] = n + 1;
  cin >> m;
  for (int i = 1; i <= m; ++i) {
    cin >> b[i];
  }
  b[++m] = n + 1;
  for (int i = 0; i <= n + 1; ++i) {
    idx[a[i]].push_back(i);
  }
  vector<int> order(n + 2);
  for (int i = 0; i <= n + 1; ++i) {
    order[i] = i;
  }
  sort(order.begin(), order.end(), [&](int x, int y) { return a[x] < a[y]; });
  for (int i = 0; i <= n + 2; ++i) {
    addfw(fw, i, p[i]);
  }
  int rev_ptr = 0;
  int ptr = 0;
  for (int i = 1; i <= m; ++i) {
    while (rev_ptr < order.size() && a[order[rev_ptr]] < b[i - 1] + 1) {
      int j = order[rev_ptr++];
      addfw(fw, j, -p[j]);
    }
    while (ptr < order.size() && a[order[ptr]] <= b[i - 1]) {
      int j = order[ptr++];
      if (p[j] < 0) {
        addfw(fw2, j, p[j]);
      }
    }
    int prev_ptr = 0;
    int prev_sz = (int)idx[b[i - 1]].size();
    long long best = llinf;
    for (int cur : idx[b[i]]) {
      dp[cur] = llinf;
      while (prev_ptr < prev_sz && idx[b[i - 1]][prev_ptr] < cur) {
        int prv = idx[b[i - 1]][prev_ptr++];
        long long val = dp[prv] - get(fw, prv) - get(fw2, prv);
        if (dp[prv] != llinf) {
          best = min(best, val);
        }
      }
      if (best != llinf) {
        dp[cur] = best + get(fw, cur - 1) + get(fw2, cur - 1);
      }
    }
  }
  long long ans = llinf;
  for (int cur : idx[b[m]]) {
    ans = min(ans, dp[cur]);
  }
  if (ans == llinf)
    cout << "NO" << endl;
  else
    cout << "YES" << endl << ans << endl;
  return 0;
}
