結果

問題 No.382 シャイな人たち (2)
ユーザー 東前頭十一枚目東前頭十一枚目
提出日時 2019-07-12 00:47:43
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
RE  
実行時間 -
コード長 3,119 bytes
コンパイル時間 1,701 ms
コンパイル使用メモリ 170,124 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-04-26 15:40:10
合計ジャッジ時間 7,825 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In member function 'bool MaximumClique<bit>::addEdge(int, int) [with int bit = 128]':
main.cpp:17:17: warning: control reaches end of non-void function [-Wreturn-type]
   17 |                 ++E;
      |                 ^~

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

template<int bit>
struct MaximumClique {
	const int V;
	int E = 0;
	bitset<bit> ans;
	vector<bitset<bit>> G;
	MaximumClique(const int V) :
		V(V),
		G(vector<bitset<bit>>(V))
		{}
	bool addEdge(const int from, const int to) {
		if(G[from][to]) return false;
		G[from][to] = G[to][from] = true;
		++E;
	}
	void increment(bitset<bit> &mask) {
		for(int i = 0; i < bit; ++i) {
			if(not mask[i]) {
				mask[i] = true;
				return;
			}
			mask[i] = false;
		}
	}
	void reverse() {
		bitset<bit> mask((1ll << V) - 1);
		mask.flip();
		for(int i = 0; i < V; ++i) {
			G[i].flip();
			G[i] ^= mask;
		}
	}
	bitset<bit> build() {
		bitset<bit> mask((1ll << V) - 1);
		return build(mask, E);
	}
	bitset<bit> build(bitset<bit> mask, int E) {
		if(mask.count() < ans.count()) return ans;
		bitset<bit> ret = clique(mask);
		for(int i = 0; i < V; ++i) {
			if(mask[i]) {
				int deg = G[i].count();
				if(deg * deg < 2 * E) {
					bitset<bit> ex;
					for(int j = 0; j < V; ++j) {
						if(G[i][j]) {
							G[i].flip(j);
							G[j].flip(i);
							ex[j] = true;
							--E;
						}
					}
					ret = build(mask.flip(i), E);
					for(int j = 0; j < V; ++j) {
						if(ex[j]) {
							G[i].flip(j);
							G[j].flip(i);
						}
					}
				}
			}
		}
		return (ans = ret);
	}
	bitset<bit> clique(bitset<bit> mask) {
		// cerr << "clique : " << bitset<5>(mask) << endl;
		// for(int i = 0; i < V; ++i) {
		// 	cerr << i << " : " << bitset<5>(G[i]) << endl;
		// }
		const int V = mask.count();
		int node[V];
		for(int i = 0, cnt = 0; i < V; ++i, ++cnt) {
			while(not mask[cnt]) ++cnt;
			node[i] = cnt;
		}
		bitset<bit> ret = ans;
		for(bitset<bit> mask; not mask[V]; increment(mask)) {
			// cerr << "group : " << bitset<5>(mask) << endl;
			if(mask.count() < ret.count()) continue;
			try {
				for(int i = 0; i < V; ++i) {
					if(mask[i]) {
						for(int j = 0; j < V; ++j) {
							if(i == j) continue;
							if(not mask[j]) continue;
							// if(not (((G[node[i]] >> j) & 1) & ((mask >> j) & 1))) {
							if(not G[node[i]][j]) {
								// cerr << i << " diff : " << bitset<5>(G[node[i]]) << endl;
								// cerr << j << " diff : " << bitset<5>(mask) << endl;
								throw "INVALID";
							}
						}
					}
				}
			}
			catch(...) {
				continue;
			}
			ret = mask;
			// cerr << bitset<5>(ret) << endl;
			// ret = (__builtin_popcountll(ret) > __builtin_popcountll(mask) ? ret : mask);
		}
		// cerr << "result : " << bitset<5>(ret) << endl;
		return (ans = ret);
	}
};

int main() {
	const int MOD = 1e6 + 3;
	int64_t s; cin >> s;
	s = s * 12345 % MOD;
	int n = s % 120 + 2;
	MaximumClique<128> mc(n);
	s = s * 12345 % MOD;
	int64_t p = s;
	for(int i = 0; i < n; ++i) {
		for(int j = i + 1; j < n; ++j) {
			s = s * 12345 % MOD;
			if(s >= p) {
				mc.addEdge(i, j);
			}
		}
	}
	mc.reverse();
	mc.build();
	int ans = mc.ans.count() - 1;
	if(ans == n - 1) {
		cout << -1 << '\n';
		return 0;
	}
	cout << ans << '\n';
	for(int i = 1, cnt = 0; i <= n or cnt < ans; ++i) {
		if(mc.ans[i - 1]) {
			cout << i << (cnt == n - 1 ? '\n' : ' ');
			++cnt;
		}
	}
	return 0;
}
0