95分,玄关求条
查看原帖
95分,玄关求条
187754
lwwwb_555楼主2024/11/10 19:22

WA on #3

用的是哈希来做的,虽然有可能WA,但也不至于交了十多发还WA吧,所以怀疑哪里写假了,求大佬帮忙调。

#include<bits/stdc++.h>
using namespace std;
int k,tree[400005],vis[100005],n,m,tot,Next[400005],to[400005],First[100005],dep[100005],f[100005][21];
unsigned long long d[100005],tre[400005];
struct edge{
	int st,en;
}ee[400005];
inline long long read(){
	long long res=0,f=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c)){
		res=(res<<3)+(res<<1)+c-'0';
		c=getchar();
	}
	return res*f;
}
void add(int x,int y){
	Next[++tot]=First[x];
	First[x]=tot;
	to[tot]=y;
}
void dfs(int u,int fa){
	vis[u]=1;
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(int e=First[u];e;e=Next[e]){
		int v=to[e];
		if(vis[v]) continue;
		tree[e]=1;
		tree[e^1]=1;
		dfs(v,u);
	}
	return;
}
int dfs2(int u,int fa){
	for(int e=First[u];e;e=Next[e]){
		int v=to[e];
		if(v==fa || !tree[e]) continue;
		d[u]^=dfs2(v,u);
	}
	return d[u];
}
int getlc(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=20;i>=0;i--)if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	if(u==v) return u;
	for(int i=20;i>=0;i--)if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}
int n1[50],n2[50],n1tot=0,n2tot=0,vv[50];
int main(){
	srand(time(0));
	n=read(),m=read();
	tot++;
	for(int i=1;i<=m;i++){
		ee[i].st=read(),ee[i].en=read();
		add(ee[i].st,ee[i].en),add(ee[i].en,ee[i].st);
	}
	dfs(1,0); 
	for(int i=1;i<=20;i++)for(int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1];
	for(int i=1;i<=m;i++){
		if(!tree[i*2]){
			tre[i]=1ll*rand()*rand();
			int u=ee[i].st,v=ee[i].en;
			if(dep[u]>dep[v]) swap(u,v);
			d[u]^=tre[i];
			d[v]^=tre[i];
		}
	}
	dfs2(1,0);
	k=read();
	for(int i=1;i<=m;i++) if(dep[ee[i].st]>dep[ee[i].en]) swap(ee[i].st,ee[i].en);
	for(int i=1;i<=k;i++){
		int c=read();
		n1tot=0,n2tot=0;
		for(int j=1;j<=c;j++){
			int x=read();
			if(tree[x*2]) n1[++n1tot]=x,vv[n1tot]=d[ee[x].en];
			else n2[++n2tot]=x;
		}
		bool flag=0;
		for(int j=1;j<=n2tot;j++){
			int t=ee[n2[j]].en,s=ee[n2[j]].st;
			for(int kk=1;kk<=n1tot;kk++){
				int u=ee[n1[kk]].st,v=ee[n1[kk]].en;
				if(getlc(v,t)==v && getlc(u,s)==s){
					vv[kk]^=tre[n2[j]];
				}
			}
		}
		sort(vv+1,vv+n1tot+1);
		for(int j=1;j<=n1tot;j++){
			if(!vv[j] || vv[j]==vv[j-1]){
				flag=1;
				break;
			}
		}
		if(flag){
			printf("Disconnected\n");
		}else{
			printf("Connected\n");
		}
	}
	return 0; 
}
2024/11/10 19:22
加载中...