[ NOI 2001 ] 食物链
\(\\\)
Description
有三类动物 \(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 句话,输出假话的总数。
- \(n\le 5\times 10^4,K\le 10^5\)
\(\\\)
Solution
扩展域的并查集。
建立三个域,分别为 \(x,x+n,x+2n\)。
如果 \(x,y\) 在一个集合里,代表 \(x,y\) 是同类。
如果 \(x+n,y\) 在一个集合里,代表 \(y\) 为 \(x\) 的捕食对象。
如果 \(x+2n,y\) 在一个集合里,代表 \(y\) 为 \(x\) 的天敌。
注意这里以 \(x\) 为中心构建的集合,具有代表意义。
即 \(x+n,x+2n\) 只作为中转点,所在的集合中所有 \(n\) 范围内的点含义相同。
\(\\\)
对于同类语句:
如果某一个是另一个的天敌或捕食对象 \(GG\) 。
否则合并两者的三个集合。
\(\\\)
对于捕食语句 \((x\) 捕食 \(y)\):
如果两者是同类 \(GG\) 。
如果 \(y\) 是 \(x\) 的天敌 \(GG\) 。
因为只有三个集合,所以合并:
\(x\) 和 \(y+2n\): \(x\) 是 \(y\) 的天敌。
\(x+n\) 和 \(y\) : \(y\) 是 \(x\) 的捕食对象。
\(x+2n\) 和 \(y+n\) :第三类关系,\(x\) 的天敌一定是 \(y\) 的捕食对象。
\(\\\)
在这个过程中应该有一些思考。
合并的有效对象其实一直是 \([1,n]\) 范围内的点,而我们只是通过等价关系借用了两个扩展域合并。
所有的查询也是借用定义,实则查的其实还是 \([1,n]\) 范围内的点。
\(\\\)
Code
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 150010
#define R register
#define gc getchar
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
int n,m,ans,f[N];
inline void reset(){for(R int i=1;i<N;++i) f[i]=i;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
inline void merge(int x,int y){f[find(x)]=find(y);}
int main(){
n=rd(); m=rd(); reset();
for(R int i=1,op,x,y;i<=m;++i){
op=rd(); x=rd(); y=rd();
if(x>n||y>n){++ans;continue;}
if(op==1){
if(find(x)==find(y+n)||find(x)==find(y+2*n)){++ans;continue;}
merge(x,y); merge(x+n,y+n); merge(x+n*2,y+n*2);
}
else{
if(x==y){++ans;continue;}
if(find(x)==find(y)||find(x+2*n)==find(y)){++ans;continue;}
merge(x,y+n*2); merge(x+n,y); merge(x+n*2,y+n);
}
}
printf("%d\n",ans);
return 0;
}
[ NOI 2001 ] 食物链的更多相关文章
- NOI 2001 食物链(eat)
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description ...
- NOI 2001 食物链 /// 并查集 oj22035
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1~N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- NOI全国赛(2001)--食物链
今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...
- [NOI 2001]炮兵阵地
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一 ...
- [ NOI 2001 ] 方程的解数
\(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...
- Codevs 1074 食物链 2001年NOI全国竞赛
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...
- CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)
题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...
- 1074 食物链 2001年NOI全国竞赛
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 ...
- 食物链 2001年NOI全国竞赛
时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...
随机推荐
- TensorFlow-GPU环境配置之四——配置和编译TensorFlow
首先,使用configure进行配置 配置完成后,使用bazel编译retrain命令,编译命令中加入--config=cuda即为启用GPU 编译进行中... 编译完成 编译完成后,调用retrai ...
- openstack setup demo Image service
Image service (glance)是openstack中管理vm image的service.本文包含以下内容: overview install overview glance包含以下部分 ...
- 数据库可视化操纵软件有navicat和sqlyog
数据库可视化操纵软件有navicat和sqlyog 数据库可视化操纵软件有navicat和sqlyog
- Utuntu下Xshell使用+vi使用
记得上次Utuntu下Xshell环境没有搭建成功,这个又试试! 按照以前的方法测试Utuntu的ip;在本机安装Xshell 然后出现xshell连接虚拟机时,提示SSH服务器拒绝了密码 修改方法: ...
- css 實現微信聊天類似的氣泡
要實現這樣的效果 代碼如下: --------------------------------------- <style> .test{width:300px; padding:30px ...
- 详解cisco访问控制列表ACL
一:访问控制列表概述 ·访问控制列表(ACL)是应用在路由器接口的指令列表.这些指令列表用来告诉路由器哪些数据包可以通过,哪些数据包需要拒绝. ·工作原理:它读取第三及第四层包头中的信息,如源 ...
- 用Java开发50个棋类游戏
眼下已经开发完了两个 1A2B 24点 打算开发以下的.直接在QQ上玩. QQ机器人已经有了.我们直接写业务即可.有兴趣的參与.机器人婷婷体验群 Java技术交流 207224939 四棋 小枪大炮 ...
- 人脸识别“Neural Aggregation Network for Video Face Recognition”
人脸识别的新方法.主要对视频进行处理.使用CNN提取视频中多帧人像的特征,之后使用聚合模块对全部帧的特征向量进行学习累积.实验结果表明这样的方法比手工设计的方法如平均池化要好.人脸识别结构例如以下图所 ...
- 重构——Martin Fowler 阅读笔记
重构的第一步: 为即将修改的代码建立一组可靠的测试环境. 和任何重构手法一样,当提炼一个函数时,我们必须知道可能出什么错. 安全步骤: 首先在一个函数内找到局部变量和参数.任何不会被修改的变量都可以被 ...
- 【bzoj1149】 [CTSC2007]风玲Mobiles
题目意为:给一颗二叉树,每一次操作可以交换该子树的左右两颗子树,要将该树变为完全二叉树,求最小操作次数.从根开始进行一遍DFS.记录每棵子树的大小size,如果左子树的size小于右子树的size那么 ...