제출 #557540

#제출 시각아이디문제언어결과실행 시간메모리
557540fatemetmhrPolitical Development (BOI17_politicaldevelopment)C++17
100 / 100
339 ms41704 KiB
// `Be name khoda` // #include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn5 = 2e5 + 10; set <int> adjset[maxn5]; vector <int> adj[maxn5], ver; priority_queue <pair<int, int>> av; bool ed[20][20], mark[maxn5], dp[1 << 20]; int cnt[maxn5]; inline int max_indep(){ int n = ver.size(); assert(n <= 10); memset(ed, false, sizeof ed); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) if(adjset[ver[i]].find(ver[j]) != adjset[ver[i]].end()) ed[i][j] = true; dp[0] = true; int ans = 0; for(int mask = 1; mask < (1 << n); mask++){ int v = -1; dp[mask] = true; for(int i = 0; i < n; i++) if((mask >> i)&1){ if(v == -1){ v = i; dp[mask] = dp[mask ^ (1 << i)]; } else dp[mask] &= ed[v][i]; } if(dp[mask]) ans = max(ans, __builtin_popcount(mask)); } return ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; for(int i = 0; i < n; i++){ int l; cin >> l; cnt[i] = l; while(l--){ int a; cin >> a; adj[i].pb(a); adjset[i].insert(a); assert(a != i); } av.push({-cnt[i], i}); } for(int i = 0; i < n; i++) for(auto u : adj[i]) assert(adjset[u].find(i) != adjset[u].end()); int ans = 0; for(int i = 0; i < n; i++){ while(mark[av.top().se]) av.pop(); int v = av.top().se; av.pop(); mark[v] = true; ver.clear(); for(auto u : adj[v]) if(!mark[u]){ cnt[u]--; av.push({-cnt[u], u}); ver.pb(u); } ans = max(ans, max_indep() + 1); } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...