【NOI2001】食物链

题意

动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B

吃 C,C 吃 A。

现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道

它到底是哪一种。

有人用两种说法对这 N 个动物所构成的食物链关系进行描述:

第一种说法是“1 X Y”,表示 X 和 Y 是同类。

第二种说法是“2 X Y”,表示 X 吃 Y 。

此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真

的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

• 当前的话与前面的某些真的话冲突,就是假话

• 当前的话中 X 或 Y 比 N 大,就是假话

• 当前的话表示 X 吃 X,就是假话

你的任务是根据给定的 N 和 K 句话,输出假话的总数。

解法

  1. 我们开三个并查集,分别表示这个动物 本身 食物 天敌,然后每次合并时,判断一下是否违法,并将对应的关系合并,就可以统计出假话的个数了。
  2. 我们利用权值并查集,用 $ kind[ i ] $表示 i 与他的父亲的关系。

    0 表示他与他的父亲是同类。

    1 表示他被他的父亲吃。

    2 表示他吃他的父亲。

    然后我们要获取父亲与他的关系,就用 $ ( 3 - kind[ i ] ) $就行了。更新关系就用 $ kind[i] = (kind[fa]+kind[i]) \mod 3 $。

代码

第一类

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=0;T k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=(5e4+10)*3;
int fa[maxn];
int _find(int x) {
return fa[x]==x ? x : fa[x]=_find(fa[x]);
}
void uni(int x,int y) {
int f1=_find(x),f2=_find(y);
if(f1!=f2) fa[f2]=f1;
} int n,k;
int main()
{
read(n),read(k);
for(int i=1;i<=3*n;i++) fa[i]=i;// x本身 ,x+n食物 ,x+2*n天敌
int tot=0;
for(int i=1;i<=k;i++) {
int c,x,y;
read(c),read(x),read(y);
if(x>n || y>n) {++tot;continue;}
if(c==1) {
if(_find(x+n)==_find(y) || _find(x+2*n)==_find(y)) ++tot;
else {
uni(x,y),uni(x+n,y+n),uni(x+2*n,y+2*n);
}
}
else {
if(x==y) {++tot;continue;}
if(_find(x)==_find(y) || _find(x+2*n)==_find(y)) ++tot;
else {
uni(x+n,y),uni(x,y+2*n),uni(x+2*n,y+n);
}
}
}
printf("%d",tot);
return 0;
}

第二类

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=0;T k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=5e4+10;
int fa[maxn],kind[maxn];
int _find(int x) {
int f=fa[x];
if(f!=x) {
fa[x]=_find(fa[x]);
kind[x]=(kind[x]+kind[f])%3;
}
return fa[x];
}
int n,k;
int main()
{
read(n),read(k);
for(int i=1;i<=n;i++) fa[i]=i;
int tot=0;
for(int i=1;i<=k;i++) {
int c,x,y;
read(c),read(x),read(y);
if(x>n || y>n || (c==2&&x==y)) {++tot;continue;}
if(c==1) {
int f1=_find(x),f2=_find(y);
if(f1==f2) {if(kind[x]!=kind[y]) ++tot;}
else fa[f2]=f1,kind[f2]=(3-kind[y]+kind[x])%3;
}
else {
int f1=_find(x),f2=_find(y);
if(f1==f2) {if((kind[x]-kind[y]+3)%3!=2) ++tot;}
else fa[f2]=f1,kind[f2]=(4-kind[y]+kind[x])%3;
}
}
printf("%d",tot);
return 0;
}

【NOI2001】食物链的更多相关文章

  1. NOI2001 食物链【扩展域并查集】*

    NOI2001 食物链 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

  2. 洛谷 P2024 [NOI2001]食物链 解题报告

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...

  3. 【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集

    P2024 [NOI2001]食物链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 动物王国中有三类动物 \(A,B ...

  4. NOI2001 食物链

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

  5. P2024 [NOI2001]食物链 并查集

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

  6. LG2024 [NOI2001]食物链

    拆点法 用并查集维护每种动物的同类.天敌.食物群 #include<cstdio> int fa[300005]; int n,k,ans; inline int read() { int ...

  7. 洛谷 P2024 [NOI2001]食物链 (并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...

  8. NOI2001食物链

    描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...

  9. [NOI2001] 食物链 (扩展域并查集)

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

  10. 洛谷 P2024 [NOI2001]食物链

    题意简述 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 1."1 X Y",表示 X 和 Y 是同类. 2."2 X Y",表示 X 吃 Y . ...

随机推荐

  1. properties 乱码问题

    File --> Others Settings --> Default Settings

  2. String 字符串的追加,数组拷贝

    package chengbaoDemo; import java.util.Arrays; /** *需求:数组的扩容以及数据的拷贝 *分析:因为String的实质是以字符数组存储的,所以字符串的追 ...

  3. 从MySQL临时表谈到filesort

    内部临时表的类型和产生时机相关,翻译自:http://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html In some ca ...

  4. RabbitMQ从入门到精通

    RabbitMQ从入门到精通 学习了:http://blog.csdn.net/column/details/rabbitmq.html RabbitMQ是AMQP(advanced message ...

  5. hdu5319 Painter(模拟)

    题目链接:点击打开链接 题目大意:给一个矩形.有两把刷子,一把刷红色,一把刷蓝色,红色的方向是东南,蓝色的方向是西北,红色加蓝色等于绿色,如今已知这面墙当前的状态.求从白墙到这个状态最少刷了多少次. ...

  6. 如何在IE浏览器里模仿DomContentLoaded

    稍微了解一点框架的事件绑定的都知道 window.onload 事件需要在页面所有内容(包括图片.flash.iframe等)加载完后,才执行,但往往我们更希望在 DOM 一加载完就执行脚本,而各大框 ...

  7. Android图文混排-实现EditText图文混合插入上传

    前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中.须要支持文本和图片的混合插入,下图演示输入的演示样例: 当会议 ...

  8. c1

    dmg和package是安装文件,dmg直接拖进应用程序中,pkg要进行安装. playfround是swift项目. --ios -----oc(面向对象的C) -----swift(oc的封装) ...

  9. IOC与DI区别

    (1)IOC:控制反转,把对象创建交给spring进行配置. (2)DI:依赖注入,向类里面的属性中设置值. (3)关系:依赖注入不能单独存在,需要在IOC的基础之上完成操作.

  10. c语言实现皇帝翻牌游戏

    一个综合的游戏,对所学的知识进行整合!融会贯通! #include <stdio.h> #include <stdlib.h> #include <string.h> ...