제출 #1254328

#제출 시각아이디문제언어결과실행 시간메모리
1254328kaiboyFriends (BOI17_friends)C++20
100 / 100
154 ms16724 KiB
// coached by rainboy
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

const int N = 2500;

bool aa[N][N];
vector<int> ej[N];
bool visited[N], used[N];
int qu[N], cnt, c, d, s;
int ii[N][N], kk[N], ii_[N];
int n, c_, s_;

bool solve() {
	if (c <= c_ && s <= s_)
		return true;
	if (c > c_ || d > s_)
		return false;
	int i = -1;
	for (int h = 0; h < cnt; h++)
		if (!visited[qu[h]]) {
			i = qu[h];
			break;
		}
	if (i == -1)
		return false;
	visited[i] = used[i] = true, c++;
	for (int j : ej[i]) {
		qu[cnt++] = j;
		if (used[j])
			s--;
		else
			s++;
	}
	if (solve())
		return true;
	used[i] = false, c--, d++;
	for (int j : ej[i]) {
		cnt--;
		if (used[j])
			s++;
		else
			s--;
	}
	if (solve())
		return true;
	visited[i] = false, d--;
	return false;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	cin >> n >> c_ >> s_;
	for (int i = 0; i < n; i++) {
		int d; cin >> d;
		if (d > c_ + s_) {
			cout << "detention\n";
			return 0;
		}
		while (d--) {
			int j; cin >> j;
			aa[i][j] = true;
			ej[i].push_back(j);
		}
	}
	for (int i = 0; i < n; i++)
		for (int j = i + 1; j < n; j++)
			if (aa[i][j] != aa[j][i]) {
				cout << "detention\n";
				return 0;
			}
	for (int i_ = 0; i_ < n; i_++) {
		for (int i = 0; i < n; i++)
			visited[i] = used[i] = false;
		c = d = s = 0;
		visited[i_] = used[i_] = true, c++, cnt = 0;
		for (int j : ej[i_])
			qu[cnt++] = j, s++;
		if (!solve()) {
			cout << "detention\n";
			return 0;
		}
		for (int i = 0; i < n; i++)
			if (used[i])
				ii[i_][kk[i_]++] = i;
	}
	for (int l = 0; l < n; l++)
		for (int r = l + 1; r < n; r++) {
			int kl = kk[l], kr = kk[r], k = 0;
			for (int hl = 0, hr = 0; hl < kl && hr < kr; ) {
				int il = ii[l][hl], ir = ii[r][hr];
				if (il < ir)
					hl++;
				else if (il > ir)
					hr++;
				else
					ii_[k++] = il, hl++, hr++;
			}
			if (!k)
				continue;
			int sl = 0, sr = 0;
			for (int h = 0; h < k; h++) {
				int i = ii_[h];
				for (int hl = 0; hl < kl; hl++)
					if (aa[i][ii[l][hl]])
						sl++;
				for (int hr = 0; hr < kr; hr++)
					if (aa[i][ii[r][hr]])
						sr++;
			}
			if (sl < sr) {
				int kl_ = 0;
				for (int hl = 0; hl < kl; hl++) {
					int il = ii[l][hl];
					bool yes = true;
					for (int h = 0; h < k; h++)
						if (il == ii_[h]) {
							yes = false;
							break;
						}
					if (yes)
						ii[l][kl_++] = il;
				}
				kk[l] = kl_;
			} else {
				int kr_ = 0;
				for (int hr = 0; hr < kr; hr++) {
					int ir = ii[r][hr];
					bool yes = true;
					for (int h = 0; h < k; h++)
						if (ir == ii_[h]) {
							yes = false;
							break;
						}
					if (yes)
						ii[r][kr_++] = ir;
				}
				kk[r] = kr_;
			}
		}
	int m = 0;
	for (int i = 0; i < n; i++)
		if (kk[i])
			m++;
	cout << "home\n";
	cout << m << '\n';
	for (int i = 0; i < n; i++) {
		int k = kk[i];
		if (k) {
			cout << k;
			for (int h = 0; h < k; h++)
				cout << ' ' << ii[i][h];
			cout << '\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...