[Luogu 2024] 食物链

<题目链接>


几句随感

我依稀记得联赛前本来想做这题的时候。

当年啊弱到题目与标签就令我望而生畏。

还有翻阅很多遍那现在已经被遗弃的博客。

看到题解中「三倍数组」的字眼就怕难而放弃。

如今我来了,晚了太多。

只可惜,总有的步伐是我留不住的。

也许我会说「其实你的写法可以更简单」。

也许我会说「判断条件可以不用那么多的」。

也许我会说「那句 continue 完全可以删除」。

也许,「不是你想 A 就能 A 的」。

也许,「可是该退还是要退的」。

……


题解

以后并查集杜绝 Merge,一律 Union。

建立补集。并查集分三段,每段长为 n,分别表示 A B C。说白了就是 f 数组开三倍,\([1,n],[n+1,2n],[2n+1,3n]\) 分别表示 A B C。

越界肯定是假的,跳过。

如果 x,y 同类,但这俩已经有捕食关系,这句话就是假的。

如果 x 吃 y,但这俩已经是同类或者 y 已经吃 x,这句话就是假的。

否则,这句话就是真的,那么执行下列操作。

x,y 是同类,分别在 A B C 段内 Union(x,y)。

x 吃 y,A->y 连 B->x,B->y 连 C->x,C->y 连 A->x。(当然 x 吃 y 写成 x 连 y 也是可以的,但鉴于本人刚学了生态系统的能量流动,就按生物的标准写了qwq)

最后输出假话数目就好了。

#include <cstdio>
const int MAXN=50010;
int n,k,ans;
class UFS
{
private:
int f[MAXN*3];
int Find(int x)
{
return x==f[x] ? x : f[x]=Find(f[x]);
}
void Union(int x,int y)
{
f[Find(y)]=Find(x);
}
public:
UFS(int n)
{
for(int i=1;i<=n*3;++i)
f[i]=i;
}
void UnionSame(int x,int y)
{
Union(x,y);
Union(x+n,y+n);
Union(x+(n<<1),y+(n<<1));
}
void UnionEat(int x,int y)
{
Union(x+n,y);
Union(x+(n<<1),y+n);
Union(x,y+(n<<1));
}
bool Connected(int x,int y)
{
return Find(x)==Find(y);
}
};
int main(int argc,char** argv)
{
scanf("%d %d",&n,&k);
static UFS *S=new UFS(n);
for(int i=1,opt,x,y;i<=k;++i)
{
scanf("%d %d %d",&opt,&x,&y);
if(x>n || y>n)
{
++ans;
continue;
}
if(opt==1)
if(S->Connected(x,y+n) || S->Connected(x+n,y))
++ans;
else
S->UnionSame(x,y);
else
if(S->Connected(x,y) || S->Connected(x,y+n))
++ans;
else
S->UnionEat(x,y);
}
printf("%d\n",ans);
delete S;
return 0;
}

谢谢阅读。

最新文章

  1. render()方法是render_to_response
  2. sys.stdout.write与sys.sterr.write(一)
  3. web安全之sql注入的防御
  4. 数据库表映射到MyEclipse的实体对象
  5. skynet的协程
  6. NSArray和NSMutableArray
  7. A840S黑砖修复过程(2013-05-22修改)
  8. Simple Membership 学习笔记
  9. 8 Things Every Person Should Do Before 8 A.M.
  10. jQuery中get与eq的区别
  11. C# 创建新RTF文件
  12. Array类型(二)
  13. 使用brew安装软件
  14. 一个比较实用的商业级图表Echarts
  15. git使用方法收藏
  16. beoplay(BO)耳机拒绝配对的解决方法
  17. 自定义组件的properties和data
  18. gitlab 误关闭sign-in
  19. 通过cookies跳过验证码登陆页面,直接访问网站的其它URL
  20. 2.BIND服务基础及域主服务器配置

热门文章

  1. 软工1816 &#183; Alpha冲刺(7/10)
  2. Beta结束感想
  3. [图算法] 1003. Emergency (25)
  4. 网页显示百度地图 Jquery
  5. Android Espresso(UI自动化测试)的搭建
  6. 从原理上搞定编码(二)-- Web编码
  7. 【JavaScript】20款漂亮的css字体
  8. 【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)
  9. [JSOI2009]瓶子和燃料
  10. 【HEOI 2018】林克卡特树