链接: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

相关文章:

  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2021-11-13
  • 2022-01-12
猜你喜欢
  • 2022-12-23
  • 2021-11-08
  • 2022-12-23
  • 2021-10-23
  • 2021-10-27
  • 2021-09-22
相关资源
相似解决方案