[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;
}

谢谢阅读。

[Luogu 2024] 食物链的更多相关文章

  1. 【luogu P2024 食物链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2024 摘吊打集训队的九日dalao一句话 关于带有多个相对集合的全集,我们可以多开几倍的空间.每一倍的元素表 ...

  2. luogu P2024 食物链

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  3. 【洛谷】P1892 团伙(并查集)+ 求助

    题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两个强盗是同一团伙的 ...

  4. 【luogu P4017 最大食物链计数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4017 DAG + DP #include <queue> #include <cstdio ...

  5. 【Luogu P2024&P1892】食物链&团伙(并查集拓展域)

    Luogu P1892 Luogu P2024 这两道一眼看过去很容易发现可以用并查集来做--但是当我们仔细阅读题面后,会发现其实并没有那么简单. 我们知道并查集可以很轻松地维护具有传递性的信息,也就 ...

  6. luogu P3183 [HAOI2016]食物链 |记忆化搜索

    如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am- ...

  7. 「Luogu P3183」[HAOI2016]食物链 解题报告

    身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ...

  8. Luogu P2024 [NOI2001]食物链

    并查集 首先先要读懂题目,a是b的食物的话,b的天敌是a,b的食物是a的天敌 比如,人吃鸡,鸡吃草,那么草吃人..... 所以建3个并查集,+n时表示这是其食物,+2*n时表示这是其天敌 所以当x,y ...

  9. Luogu P2024 [NOI2001]食物链 | 并查集

    题目链接 思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的 ...

随机推荐

  1. c# apache服务器请求得到数据(初级)

    1.代码: string data = new WebClient().DownloadString("http://localhost:81/123.txt");

  2. Python:列表操作总结

    一.创建一个列表 只要把逗号分隔的不同数据项使用方括号括起来即可 list1=['physics','chemistry',1997,2000] list2=[1,2,3,4,5,6,7] [注]:1 ...

  3. 基于 IBM WAS ND v6.1 搭建稳定高效的集群环境

    如今的电子商务及电子政务应用系统的发展已经到了一个新的阶段,应用系统的成熟度和可用性都达到了更高的水准.因此庞大的部署规模和海量的用户访问成为目前大型电子商务及电子政务应用系统的显著特征.在这样的情况 ...

  4. 软工网络15团队作业4——Alpha阶段敏捷冲刺-6

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 完成对账单的编辑,删除等操作,以及开始服务器的编写工作 明天计划完成的工作: 记账功能基本完成,进一步优化功能与完善服务器 工作中遇到的困难 ...

  5. 补发9.26“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.26 地点:612寝 组员 已完成 未完成 王森 可行性分析 找出设计亮点 张金生 寻找UI素材 设计用户操作 张政 搭建环境 基础逻辑框 ...

  6. websocket服务器+客户端

    <?php $demo = new ws('192.168.90.47',12345); $demo->run(); class ws { //当前服务端主连接 private $curr ...

  7. ZOJ3067_Nim

    题目的意思就不说了,典型的取石子的博弈问题. 题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身. 但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法. 首先要想 ...

  8. java catch 捕获异常后会产生一个实例对象 该对象能使用父类的方法

  9. ICPCCamp 2017 I Coprime Queries

    给出一个长度为\(n\)的正整数序列\(a\),\(m\)次询问\(l,r,x\),问\(max\{i|i\in[l,r],gcd(a_i,x)=1\}\). \(n,m,a_i\le 10^5\). ...

  10. cdq分治学习

    看了stdcall大佬的博客 传送门: http://www.cnblogs.com/mlystdcall/p/6219421.html 感觉cdq分治似乎很多时候都要用到归并的思想