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

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


#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;
}


你可能感兴趣的:([乱搞 暴力 并查集] BZOJ 3563 DZY Loves Chinese)