链接:P2024

-------------------------------

建三个并查集空间太大了,应该写加权并查集

-------------------------------

这道题的关系是个环,转过来转过去的。我们的权值就定义成这个点与父节点的关系(0=同类,1=吃

2=被吃)

------------------------------

这样做,我们就要在find时如果搞路径压缩,就要麻烦一点,因为我们要把他与父节点的关系更新成与

祖先节点的关系。

非常易证得,关系就是与父节点的关系+与祖先节点的关系的和mod3的值(因为递归的原因,这个祖先节点最多就是父节点的父节点)

int find(int x){
    if(x!=f[x])
    {
        int xx=f[x];
        f[x]=find(f[x]);
        g[x]=(g[x]+g[xx])%3;
    }
    return f[x];
}
find

相关文章: