#include #include #define all(x) x.begin(), x.end() using namespace std; using namespace atcoder; using ll = long long; vector > convert_SCC_to_DAG(int n, vector& a, vector& b, vector >& route, vector >& scc) { int sz = scc.size(); vector p(sz), q(sz); vector > dag(sz, vector({})); vector group(n); for (int i = 0; i < sz; i++) { for (int x : scc[i]) { group[x] = i; p[i] += a[x]; q[i] += b[x]; } } a = p; b = q; for (int i = 0; i < n; i++) { for (int x : route[i]) { int a = group[i]; int b = group[x]; if (a != b) { dag[a].push_back(b); } } } for (vector& v : dag) { sort(all(v)); v.erase(unique(all(v)), v.end()); } return dag; } vector > get_rev_graph(int n, vector >& route) { vector > ret(n); for (int i = 0; i < n; i++) { for (int x : route[i]) { ret[x].push_back(i); } } return ret; } bool check(ll mid, int n, vector& a, vector& b, vector >& rdag) { vector dp(n); for (int i = 0; i < n; i++) { dp[i] = a[i] - b[i] * mid; } for (int i = n - 1; i >= 0; i--) { if (dp[i] >= 0) { dp[i] = 0; continue; } if (rdag[i].empty()) { return false; } for (int x : rdag[i]) { dp[x] += dp[i]; } } return true; } int main(void){ int n; cin >> n; vector a(n), b(n); vector c(n); ll sa = 0, sb = 0; for (int i = 0; i < n; i++) { cin >> a[i]; sa += a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; sb += b[i]; } for (int i = 0; i < n; i++) { cin >> c[i]; c[i]--; } vector > route(n, vector({})); scc_graph g(n); for (int i = 0; i < n; i++) { route[c[i]].push_back(i); g.add_edge(c[i], i); } vector > scc = g.scc(); vector > dag = convert_SCC_to_DAG(n, a, b, route, scc); n = scc.size(); vector > rdag = get_rev_graph(n, dag); ll ok = 0; ll ng = sa / sb + 1; while (ng - ok > 1) { ll mid = (ok + ng) >> 1ll; if (check(mid, n, a, b, rdag)) { ok = mid; } else { ng = mid; } } cout << ok << endl; return 0; }