牛客练习赛15 F - 压状Kruskal

题目链接:点击打开链接

 

解题思路:大部分都在注释里,这个复杂度很玄学,应该是可以很强的测试数据,要不然我感觉要凉,感觉这个算法复杂度至少得O(n*(n-(2^(按位算1的个数))))

 

#include
using namespace std;
const int mx = 1e5 + 5e4;
typedef long long ll;
int n,num[mx],fa[mx],a,b;
char str[mx];
ll ans;
bool vis[mx];
int find(int x)
{
	return x==fa[x]? x:fa[x] = find(fa[x]);
}
void Uinon(int x,int y)
{
	a = find(x),b = find(y);
	if(a!=b){
		ans += ll(x&y)*(num[x]+num[y]-1);//因为从小到大排,所以他们肯定是互连的,不存在和其他连的可能 
		num[x] = num[y] = 1;
		fa[b] = a;
	}
}
int main()
{
	//对于两个非负整数a,b,若(a&b)= a,则称a是b的「位元子集元素」且b是a的「位元父集元素」。
	scanf("%d%s",&n,str);
	for(int i=0;i

 

你可能感兴趣的:(状态压缩,图论)