CF986C 题解

思路

这题当然不能暴力建图,会超时。不难发现,a&b=0a\&b=0(此处的 &\& 指按位与)时,b¬a\forall b\in\neg a。于是我们只要枚举每个 ¬a\neg a 的子集就行了。

代码

# include <bits/stdc++.h>
using namespace std;
int n, maxx, a[4200005], sum;
bitset <4200005> vis, ina; //bitset 优化,另外切忌用 vector!
void dfs (int x) {
	vis[x] = 1;
	if (ina[x] && ! vis[x ^ maxx]) //如果 x 在 a 中,x ^ maxx 就是 x & b = 0 时 b 能达到最大的值。
		dfs (x ^ maxx);
	for (int i = x; i; i ^= i & -i)
		if (! vis[x ^ (i & -i)])
			dfs (x ^ (i & -i));
	return ;
}
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> maxx >> n;
	maxx = (1 << maxx) - 1;
	for (int i = 0; i < n; ++ i)
		cin >> a[i], ina[a[i]] = 1;
	for (int i = 0; i < n; ++ i)
		if (! vis[a[i]])
			vis[a[i]] = 1, dfs (a[i] ^ maxx), ++ sum;
	cout << sum;
	return 0;
}
posted @ 2024-02-26 15:26  Vitamin_B  阅读(19)  评论(0)    收藏  举报  来源