[乱搞 暴力 并查集] BZOJ 3563 DZY Loves Chinese

21 篇文章 0 订阅
20 篇文章 0 订阅

好神奇的一道题 不多说 最后一次询问暴力并查集


#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;

inline int read(int &x)
{
	static char c=getchar();
	for (;!(c>='0' && c<='9');c=getchar()) if (c=='\n' || c==EOF) return c=getchar(),0;
	for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=getchar()); return 1;
}

const int N=500005;

int n,m;
int u[N],v[N];
int num,del[N],pnt;
int fat[N];

inline int Fat(int u){
	return u==fat[u]?u:fat[u]=Fat(fat[u]);
}

inline void Union(int u,int v){
	int fx=Fat(u),fy=Fat(v);
	if (fx!=fy) fat[fx]=fy;
}

int main()
{
	int Q,K,last=0;
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++) scanf("%d%d",&u[i],&v[i]);
	scanf("%d",&Q);
	for (int i=1;i<=Q;i++)
	{
		while (!read(K));
		for (num=1;read(del[num]);num++); num--;
		if (i>1)
		{
			if ((K^last)==num) 
				printf("Disconnected\n");
			else 
				printf("Connected\n"),last++;
		}
	}
	for (int i=1;i<=num;i++) del[i]^=last;
	sort(del+1,del+num+1); pnt=1;
	for (int i=1;i<=n;i++) fat[i]=i;
	for (int i=1;i<=num;i++)
		if (del[pnt]==i) 
			pnt++;
		else
			Union(u[i],v[i]);
	int f1=Fat(1);
	for (int i=2;i<=n;i++)
		if (Fat(i)!=f1)
			return printf("Disconnected\n"),0;
	printf("Connected\n");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值