#include <bits/stdc++.h>
using namespace std;
const int N = 1 + 5e5;
const long long INF = 1e15;
struct CumulativeSet {
  long long val[N + 1];
  long long Get(int x) {
    long long val = 0;
    for (int i = x + 2; i; i -= step(i)) {
      val += this->val[i - 1];
    }
    return val;
  }
  void SetMin(int x, long long val) {
    val -= Get(x);
    if (val < 0) Add(x, x, val);
  }
  void Add(int x, int y, long long val) {
    update(x, val);
    update(y + 1, -val);
  }
  void print(int n) {
    for (int i = -1; i < n; i++) {
      long long C = Get(i);
      if (C < INF) {
        if (0) fprintf(stderr, "%lld\t", C);
      } else {
        if (0) fprintf(stderr, "oo\t");
      }
    }
    if (0) fprintf(stderr, "\n");
  }

 private:
  inline static int step(int x) { return x & -x; }
  void update(int x, long long val) {
    for (int i = x + 2; i <= N; i += step(i)) {
      this->val[i - 1] += val;
    }
  }
};
int a[N], b[N], p[N];
CumulativeSet cost;
void read(int* v, int n) {
  for (int i = 0; i < n; i++) {
    scanf("%d", v + i);
  }
}
int find(const int* v, int n, int x) {
  int ans = -1;
  for (int step = 1 << 31 - __builtin_clz(n); step; step >>= 1) {
    if (ans + step < n && v[ans + step] <= x) {
      ans += step;
    }
  }
  return ans;
}
long long solve(const int* a, const int* p, int n, const int* b, int m) {
  cost.Add(0, m - 1, 2 * INF);
  cost.print(m);
  for (int i = 0; i < n; i++) {
    int pos = find(b, m, a[i]);
    if (pos >= 0 && b[pos] == a[i]) {
      long long C = cost.Get(pos - 1);
      cost.Add(-1, p[i] > 0 ? pos - 1 : m - 1, p[i]);
      cost.SetMin(pos, C);
    } else {
      cost.Add(-1, p[i] > 0 ? pos : m - 1, p[i]);
    }
    if (0) cost.print(m);
  }
  return cost.Get(m - 1);
}
int main() {
  int n, m;
  scanf("%d", &n);
  read(a, n);
  read(p, n);
  scanf("%d", &m);
  read(b, m);
  long long cost = solve(a, p, n, b, m);
  if (cost < INF) {
    printf("YES\n%lld\n", cost);
  } else {
    puts("NO");
  }
  return 0;
}
