Submission #548858

#TimeUsernameProblemLanguageResultExecution timeMemory
548858lorenzoferrariPolitical Development (BOI17_politicaldevelopment)C++17
100 / 100
2903 ms11852 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
using namespace std;

clock_t tbegin;
constexpr float TL = 2.9;
int n, k, best = 0;
vector<int> o, ro;
vector<vector<int>> adj;

inline vector<int> intersect(const vector<int>& a, const vector<int>& b) {
	vector<int> ans;
	for (int i = 0, j = 0; i < int(a.size()) && j < int(b.size());) {
		if (a[i] == b[j]) {
			ans.push_back(a[i]);
			++i, ++j;
		} else if (ro[a[i]] < ro[b[j]]) {
			++i;
		} else {
			++j;
		}
	}
	return ans;
}

vector<vector<int>> cur;

void solve(int step, int i = 0) {
	best = max(best, step);
	if (int(cur.back().size()) <= i ||
		step + int(cur.back().size()) <= best ||
		best == k ||
		clock() - tbegin > TL*CLOCKS_PER_SEC) return;
	cur.push_back(intersect(cur.back(), adj[cur.back()[i]]));
	solve(step+1);
	cur.pop_back();
	solve(step, i+1);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	tbegin = clock();
	cin >> n >> k;
	o.resize(n);
	ro.resize(n);
	adj.resize(n);
	for (int i = 0; i < n; ++i) {
		int d; cin >> d;
		for (int a; d--;) {
			cin >> a;
			adj[i].push_back(a);
		}
	}
	iota(o.begin(), o.end(), 0);
	sort(o.begin(), o.end(), [&](int i, int j){
		return adj[i].size() > adj[j].size();
	});
	cur.push_back(o);
	for (int i = 0; i < n; ++i) ro[o[i]] = i;
	vector<vector<int>> aa(n);
	for (int i = 0; i < n; ++i) {
		for (int j : adj[i]) {
			if (ro[i] < ro[j]) {
				aa[i].push_back(j);
			}
		}
	}
	adj = aa;
	for (auto& x : adj) {
		sort(x.begin(), x.end(), [&](int i, int j){return ro[i]<ro[j];});
	}
	solve(0);
	cout << best << "\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...