// implement 24min #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; static const double EPS = 1e-9; static const double INF = 1e+8; static const double PI = acos(-1.0); #define REP(i, n) for (int i = 0; i < (int)(n); i++) #define FOR(i, s, n) for (int i = (s); i < (int)(n); i++) #define FOREQ(i, s, n) for (int i = (s); i <= (int)(n); i++) #define FORIT(it, c) for (__typeof((c).begin())it = (c).begin(); it != (c).end(); it++) #define MEMSET(v, h) memset((v), h, sizeof(v)) int n; int ps[1000]; int vs[1000]; vector child[1000]; map > > memo[1010][1 << 5]; int calcvs(int from) { int &ret = vs[from]; if (ret != -1) { return ret; } ret = -INF; if (child[from].size() != 0) { FORIT(it, child[from]) { ret = max(ret, -calcvs(*it)); } } else { ret = ps[from]; } return ret; } pair calc(int from, int used, int alpha, int beta) { if (alpha >= beta) { return make_pair(0, 0); } if (child[from].size() == 0) { return make_pair(1, 1); } else if (__builtin_popcount(used) == child[from].size()) { return make_pair(0, 0); } if (memo[from][used].count(alpha) && memo[from][used][alpha].count(beta)) { return memo[from][used][alpha][beta]; } pair &ret = memo[from][used][alpha][beta]; ret = make_pair(INF, 0); REP(i, child[from].size()) { if ((used >> i) & 1) { continue; } int to = child[from][i]; int nv = -calcvs(to); int nused = used | (1 << i); pair nret1 = calc(to, 0, -beta, -alpha); pair nret2 = calc(from, nused, max(nv, alpha), beta); ret.first = min(ret.first, nret1.first + nret2.first); ret.second = max(ret.second, nret1.second + nret2.second); } return ret; } int main() { while (scanf("%d", &n) > 0) { MEMSET(ps, -1); MEMSET(vs, -1); REP(i, 1000) { child[i].clear(); } REP(i, 1010) REP(j, 1 << 5) { memo[i][j].clear(); } REP(i, n) { int v = scanf("%d", &ps[i]); assert(v == 1); } REP(i, n) { int k; int v = scanf("%d", &k); assert(v == 1); REP(j, k) { int t; int v = scanf("%d", &t); assert(v == 1); t--; child[i].push_back(t); } } pair ans = calc(0, 0, -INF, INF); printf("%d %d\n", ans.first, ans.second); } }