Submission #307355

#TimeUsernameProblemLanguageResultExecution timeMemory
307355brkdnmzBosses (BOI16_bosses)C++17
100 / 100
907 ms1664 KiB
#include <iostream> #include <fstream> #include <cstdio> #include <vector> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <stack> #include <queue> #include <algorithm> #include <string.h> #include <string> #include <math.h> #include <iomanip> #include <cassert> #include <random> using namespace std; #define SORT(v) sort((v).begin(), (v).end()) #define RSORT(v) sort((v).rbegin(), (v).rend()) #define REVERSE(v) reverse((v).begin(), (v).end()) #define pb push_back #define FOR(i, n) for(int i = 0; i < (n); i++) typedef pair<int, int> pii; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; const int mod = 1e9 + 7; const int mod2 = 998244353; void fact_init(int n); ll exp(ll taban, ll us, ll md); ll ebob(ll a, ll b); ll ekok(ll a, ll b); ll komb(ll a, ll b); vector<ll> fact; vector<ll> inv_fact; void fact_init(int n, int md){ fact.resize(n+5); inv_fact.resize(n+5); fact[0] = inv_fact[0] = 1; for(int i = 1; i <= n; i++){ fact[i] = (fact[i-1] * i) % md; inv_fact[i] = exp(fact[i], md-2, md); } } ll exp(ll taban, ll us, ll md) { ll carpan = taban % md; if(carpan == 0) return 0; ll temp = us; ll res = 1; while(temp){ if(temp % 2) res = (res*carpan) % md; temp /= 2; carpan = (carpan*carpan) % md; } return res; } ll ebob(ll a, ll b){ if(!a)return b; return ebob(b%a, a); } ll ekok(ll a, ll b){ return (a*b)/ebob(a, b); } ll komb(int a, int b, int md){ if(a < b) return 0; return fact[a] * (inv_fact[a-b] * inv_fact[b] % md) % md; } const int N = 5e3 + 5; vector<int> rev[N]; vector<int> level[N]; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; for(int i = 1; i <= n; i++){ int k; cin>>k; for(int j = 0; j < k; j++){ int s; cin>>s; rev[s].pb(i); } } int ans = 1e9; for(int root = 1; root <= n; root++){ FOR(i, N) level[i].clear(); level[1].pb(root); bool vis[N] = {}; int cur = 0; for(int i = 1; i <= n; i++){ for(auto x: level[i]){ cur += i; vis[x] = true; for(auto child: rev[x]){ if(vis[child]) continue; vis[child] = true; level[i+1].pb(child); } } } bool ok = true; for(int i = 1; i <= n; i++) ok &= vis[i]; if(!ok) continue; ans = min(ans, cur); } cout<<ans<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...