#include <bits/stdc++.h>
using namespace std;
const int maxn = 500000 + 10;
const int maxm = maxn - 1;
const long long inf = 1e18;
const long long mod = 998244353;
const double eps = 1e-8;
const long long o = 1;
const int apsz = 26;
struct BIT {
  long long c[maxn];
  int n;
  int lowbit(int i) { return (-i) & i; }
  void init(int n) { this->n = n; }
  long long prefix(int l) {
    long long ans = 0;
    for (int i = l; i; i -= lowbit(i)) ans += c[i];
    return ans;
  }
  void modify(int l, long long v) {
    for (int i = l; i <= n; i += lowbit(i)) c[i] += v;
  }
};
BIT tree;
long long dp[maxn];
int n, m;
int a[maxn];
int b[maxn];
long long p[maxn];
vector<pair<int, int> > del[maxn];
vector<int> idx[maxn];
inline int judge() {
  for (int i = (2); i <= (m); ++i) {
    if (b[i] - b[i - 1] <= 0) return 0;
  }
  int now = 1;
  for (int i = (1); i <= (m); ++i) {
    while (now <= n && a[now] != b[i]) now++;
    if (now == n + 1) return 0;
  }
  return 1;
}
inline long long solve() {
  dp[0] = 0;
  queue<int> q[2];
  int t = 0;
  q[t].push(0);
  long long _min;
  for (int i = (1); i <= (m); ++i) {
    _min = inf;
    assert(!idx[i].empty());
    while (!q[t ^ 1].empty()) q[t ^ 1].pop();
    for (auto j : idx[i]) {
      long long v = tree.prefix(j - 1);
      while (!q[t].empty() && q[t].front() < j) {
        int r = q[t].front();
        q[t].pop();
        _min = min(_min, dp[r] - tree.prefix(r));
      }
      q[t ^ 1].push(j);
      dp[j] = min(dp[j], _min + v);
    }
    for (auto e : del[b[i]]) {
      tree.modify(e.first, -e.second);
    }
    t ^= 1;
  }
  long long ans = inf;
  long long v1 = tree.prefix(n);
  for (auto x : idx[m]) {
    long long v = tree.prefix(x);
    ans = min(ans, dp[x] + v1 - v);
  }
  return ans;
}
int main(void) {
  scanf("%d", &(n));
  for (int i = (1); i <= (n); ++i) scanf("%d", &(a[i]));
  for (int i = (1); i <= (n); ++i) scanf("%lld", &(p[i]));
  scanf("%d", &(m));
  for (int i = (1); i <= (m); ++i) scanf("%d", &(b[i]));
  if (!judge()) return puts("NO"), 0;
  tree.init(n);
  for (int i = (1); i <= (n); ++i) tree.modify(i, p[i]);
  puts("YES");
  for (int i = (1); i <= (n); ++i) {
    dp[i] = inf;
    int pt = lower_bound(b + 1, b + 1 + m, a[i]) - b;
    if (p[i] > 0 && pt <= m) {
      del[b[pt]].push_back((pair<int, int>){i, p[i]});
    }
    if (b[pt] == a[i]) idx[pt].push_back(i);
  }
  printf("%lld\n", solve());
  return 0;
}
