一开始我先预处理出find(x),find(y)
怎么调都只有20分
后来删了,改成在合并的时候每个点都直接查询
就a了
if(x>n||y>n)
{
ans++;
continue;
}
//x=find(x);
//y=find(y); 删了这里
if(opt==1)
{
int xa=find(x+n);
int xb=find(x+2*n);
if(find(y)==xa||find(y)==xb)
{
ans++;
continue;
}
f[find(x)]=find(y);
f[find(x+n)]=find(y+n);
f[find(x+2*n)]=find(y+2*n);
}
if(opt==2)
{
if(find(x)==find(y))
{
ans++;
continue;
}
if(find(y+n)==find(x))
{
ans++;
continue;//如果y反而是x的天敌
}
f[find(x+n)]=find(y);
f[find(x+2*n)]=find(y+n);
f[find(x)]=find(y+2*n);
}
}
//为什么先把x,y换成每个集合的根是错的?
//疑惑