Submission #333215

#TimeUsernameProblemLanguageResultExecution timeMemory
333215limabeansPolitical Development (BOI17_politicaldevelopment)C++17
100 / 100
1240 ms26860 KiB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;


const int maxn = 5e4 + 10;


int n,k;
set<int> g[maxn];

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

    cin>>n>>k;

    for (int i=0; i<n; i++) {
	int t;
	cin>>t;
	while (t--) {
	    int x;
	    cin>>x;
	    g[i].insert(x);
	    g[x].insert(i);
	}
    }


    queue<int> qq;
    vector<bool> added(n, false);


    for (int i=0; i<n; i++) {
	if ((int)g[i].size()<k) {
	    qq.push(i);
	    added[i] = true;
	}
    }
    
    int ans = 0;

    while (qq.size()) {
	int at = qq.front();
	qq.pop();
	int len = g[at].size();
	for (int mask=0; mask<(1<<len); mask++) {
	    int val = __builtin_popcount(mask);
	    if (val <= ans) {
		continue;
	    }
	    int tmp = mask;
	    vector<int> w;
	    for (int x: g[at]) {
		if (tmp&1) {
		    w.push_back(x);
		}
		tmp >>= 1;
	    }

	    int N = w.size();
	    bool ok = true;
	    for (int i=0; i<N && ok; i++) {
		for (int j=i+1; j<N && ok; j++) {
		    ok &= (g[w[i]].count(w[j]));
		}
	    }

	    if (ok) {
		ans = max(ans, val);
	    }
	}

	for (int to: g[at]) {
	    g[to].erase(at);
	    if ((int)g[to].size()<k && !added[to]) {
		qq.push(to);
	    }
	}
	g[at].clear();
    }


    cout<<ans+1<<endl;    
    return 0;
}
#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...