Submission #79532

#TimeUsernameProblemLanguageResultExecution timeMemory
79532DrumpfTheGodEmperorBosses (BOI16_bosses)C++14
67 / 100
1505 ms1144 KiB
#include <bits/stdc++.h> #define MOD 1000000007 #define INF 1061109567 #define INFLL 4557430888798830399 #define bp __builtin_popcountll #define pb push_back #define in(s) freopen(s,"r",stdin); #define out(s) freopen(s,"w",stdout); #define fi first #define se second #define bw(i,r,l) for (int i=r-1;i>=l;i--) #define fw(i,l,r) for (int i=l;i<r;i++) #define fa(i,x) for (auto i:x) using namespace std; const int N = 5005; int n, sz[N]; vector<int> g[N], child[N]; bool used[N]; int dfs(int u) { sz[u] = 1; int ans = 0; fa (v, child[u]) { ans += dfs(v); sz[u] += sz[v]; } ans += sz[u]; return ans; } signed main() { #ifdef BLU in("blu.inp"); #endif ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; fw (i, 0, n) { int k; cin >> k; while (k--) { int x; cin >> x; x--; g[x].pb(i); } } /* Salary of person u is equal to the number of nodes inside the subtree Fix root as r. At each step just BFS into all possible choices. */ int res = INF; fw (r, 0, n) { queue<int> q; fw (i, 0, n) child[i].clear(); q.push(r); int lft = n; memset(used, 0, sizeof used); used[r] = 1; while (!q.empty()) { lft--; int u = q.front(); q.pop(); fa (v, g[u]) if (!used[v]) { used[v] = 1; child[u].pb(v); q.push(v); } } int ans = dfs(r); if (!lft) res = min(res, ans); } cout << res; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...