Submission #551430

#TimeUsernameProblemLanguageResultExecution timeMemory
551430bluePolitical Development (BOI17_politicaldevelopment)C++17
100 / 100
433 ms29160 KiB
#include <iostream> #include <vector> #include <set> using namespace std; using vi = vector<int>; using pii = pair<int, int>; #define sz(x) int(x.size()) int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, K; cin >> N >> K; set<int> edge[N]; set<pii> people; for(int i = 0; i < N; i++) { int D; cin >> D; people.insert({D, i}); for(int j = 0; j < D; j++) { int k; cin >> k; edge[i].insert(k); } } int res = 1; // cerr << "check\n"; vi getlog(100'000, 0); for(int i = 0; i < 15; i++) getlog[(1<<i)] = i; for(int t = 0; t < N; t++) { // cerr << "t = " << t << '\n'; int u = people.begin()->second; people.erase(people.begin()); // cerr << "u = " << u << '\n'; vi currpeople{u}; for(int v : edge[u]) { currpeople.push_back(v); } int h = sz(currpeople); vi conn(h, 0); for(int i = 0; i < h; i++) { for(int j = i+1; j < h; j++) { if(edge[currpeople[i]].find(currpeople[j]) != edge[currpeople[i]].end()) { conn[i] |= (1<<j); conn[j] |= (1<<i); } } } // cerr << "done\n"; vi clique((1<<h), 0); for(int s = 1; s < (1<<h); s++) { int ss = s&-s; int rs = s - ss; if((conn[getlog[ss]] & rs) == rs) clique[s] = clique[rs] + 1; res = max(res, clique[s]); } for(int v : edge[u]) { people.erase({sz(edge[v]), v}); edge[v].erase(u); people.insert({sz(edge[v]), v}); } } cout << res << '\n'; }
#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...