Submission #1251208

#TimeUsernameProblemLanguageResultExecution timeMemory
1251208kaiboyPolitical Development (BOI17_politicaldevelopment)C++20
100 / 100
47 ms3660 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 50000;
const int M = 10;

int *ej[N], eo[N], dd[N], qu[N], ii[N], kk[1 << M];
bool aa[M][M], dp[1 << M], dq[1 << M];

bool check(int i, int j) {
	int lower = -1, upper = eo[i];
	while (upper - lower > 1) {
		int o = lower + upper >> 1;
		if (ej[i][o] <= j)
			lower = o;
		else
			upper = o;
	}
	int o = lower;
	return o >= 0 && ej[i][o] == j;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n, d_; cin >> n >> d_, d_--;
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		int d; cin >> d, eo[i] = dd[i] = d;
		ej[i] = new int[d];
		for (int o = 0; o < d; o++) {
			int j; cin >> j;
			ej[i][o] = j;
		}
		sort(ej[i], ej[i] + d);
		if (d <= d_)
			qu[cnt++] = i;
	}
	int k = 0;
	for (int b = 1; b < 1 << d_; b++)
		kk[b] = kk[b & b - 1] + 1;
	while (cnt) {
		int i = qu[--cnt], m = 0; dd[i] = -1;
		for (int o = 0; o < eo[i]; o++) {
			int j = ej[i][o];
			if (dd[j] != -1)
				ii[m++] = j;
		}
		for (int h = 0; h < m; h++) {
			aa[h][h] = true;
			for (int g = h + 1; g < m; g++)
				aa[h][g] = check(ii[h], ii[g]);
		}
		dp[0] = dq[0] = true;
		for (int b = 1, h = 0; b < 1 << m; b++) {
			if (1 << h + 1 <= b)
				h++;
			int b_ = b & b - 1, h_ = kk[(b & -b) - 1];
			dq[b] = aa[h_][h] && dq[b_];
			dp[b] = dq[b] && dp[b ^ 1 << h];
			if (dp[b])
				k = max(k, kk[b]);
		}
		for (int h = 0; h < m; h++) {
			int j = ii[h];
			if (--dd[j] == d_)
				qu[cnt++] = j;
		}
	}
	cout << k + 1 << '\n';
	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...