[题解]NOI 2001 食物链
发个题目链接吧
http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1356
【题解】
在高一妹纸的推荐下看的这道题,发现NOI竟然有水题啊啊,果断水过~~~ 因为zyy语言组织能力不强,应妹纸要求,写个题解,大神请绕道。
下面进入正题。
首先是维护信息。我们不能直接确定A、B、C,但我们可以找他们之间的关系。x吃y,那么就fa[y]=x; 维护一个三角环,对于三角环的每一个角表示同类(并查集)。
然后就是判断假话。2、3两个条件都是O(1)判断的,吴老师肯定会说:wtt都会做。。。orz 所以这里不赘述。考虑第1个判断,下面分情况讨论。
if(x、y是同类)
{
找到x所在环上的元素a[0],a[1],a[2],y所在环上的元素b[0],b[1],b[2]。
if(x、y在同一个环上)
{
if(x==y) 同类
else 假话
}
else 合并
}
else
{
找到x所在环上的元素a[0],a[1],a[2],y所在环上的元素b[0],b[1],b[2]。
if(x、y在同一个环上)
{
if(fa[b[0]]==a[0]) 真话
else 假话
}
else 合并
}
zyy好像还是木有说清楚的说。。。 所以还是上代码吧。。。。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define MAXN 50020 5 int p[MAXN*3],fa[MAXN*3]; 6 int a[4],b[4]; 7 int n,m; 8 int ans; 9 bool flag; 10 inline void Get_int(int &Ret) 11 { 12 char ch; 13 bool flag=false; 14 for(;ch=getchar(),ch<'0'||ch>'9';) 15 if(ch=='-') 16 flag=true; 17 for(Ret=ch-'0';ch=getchar(),ch>='0'&&ch<='9';Ret=Ret*10+ch-'0'); 18 flag&&(Ret=-Ret); 19 } 20 void Pre() 21 { 22 Get_int(n); 23 int i; 24 for(i=1;i<=n;i++) 25 { 26 fa[i]=i+n,fa[i+n]=i+n*2,fa[i+n*2]=i; 27 p[i]=i,p[i+n]=i+n,p[i+n*2]=i+n*2; 28 } 29 } 30 int Find(int x) 31 { 32 if(x!=p[x]) 33 p[x]=Find(p[x]); 34 return p[x]; 35 } 36 void Work() 37 { 38 Get_int(m); 39 int d,x,y; 40 int i,j,k; 41 for(i=1;i<=m;i++) 42 { 43 Get_int(d),Get_int(x),Get_int(y); 44 if(x>n||y>n) 45 { 46 ans++; 47 continue; 48 } 49 a[0]=Find(x),a[1]=fa[a[0]],a[2]=fa[a[1]]; 50 b[0]=Find(y),b[1]=fa[b[0]],b[2]=fa[b[1]]; 51 flag=false; 52 for(j=0;j<=2;j++) 53 if(a[0]==b[j]) 54 { 55 k=j; 56 flag=true; 57 break; 58 } 59 if(d==1)//the same 60 { 61 if(flag)//in a triangle 62 { 63 if(a[0]!=b[0]) 64 ans++; 65 } 66 else 67 { 68 for(j=0;j<=2;j++) 69 p[b[j]]=a[j]; 70 } 71 } 72 else//x<-->y 73 { 74 if(x==y) 75 { 76 ans++; 77 continue; 78 } 79 if(flag) 80 { 81 if(fa[b[0]]!=a[0]) 82 ans++; 83 } 84 else 85 { 86 for(j=0;j<=2;j++) 87 p[b[j]]=a[(j+2)%3]; 88 } 89 } 90 } 91 printf("%d\n",ans); 92 } 93 int main() 94 { 95 Pre(); 96 Work(); 97 return 0; 98 }
至此,此题完美解决。
转载于:https://www.cnblogs.com/CQBZOIer-zyy/archive/2013/03/18/2965366.html
[题解]NOI 2001 食物链相关推荐
- NOI[2001]食物链
今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...
- [ NOI 2001 ] 食物链
\(\\\) Description 有三类动物 \(A,B,C\),满足\(A\) 吃 \(B\),\(B\)吃 \(C\),\(C\) 吃 \(A\). 现有 \(N\) 个动物,以 \(1 - ...
- AC日记——食物链 codevs 1047
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 动物王国中有三类动物 A ...
- 【codevs1074】食物链
食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 动物王国中有三类动物 A, ...
- wikioi-天梯-提高一等-并查集-1074:食物链
题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...
- POJ 1703 Find them, Catch them(并查集高级应用)
POJ 1703 Find them, Catch them(并查集高级应用) 手动博客搬家:本文发表于20170805 21:25:49, 原地址https://blog.csdn.net/sunc ...
- NOI 题目 试题 目录 信奥 历年
NOI 题目 试题 目录 信奥 历年 NOI 2018 题目 试题 目录 信奥 历年 第一试 2018年7月18日 08:00-13:00 1.归程 return 2.冒泡排序 ...
- NOI Online 2020
NOI Online #1入门组详细题解 NOI Online #1入门组详细题解__ducati的博客-CSDN博客 [NOI2019]斗主地[期望][组合数学][下降幂][插值] [NOI2019 ...
- NOI Online 2022
[题解]NOI Online 2022 数学游戏题解 [题解]NOI Online 2022 数学游戏题解_inferior_hjx的博客-CSDN博客 NOI Online 2022入门组 数学游戏 ...
最新文章
- 用脑科学支持人工智能
- 厦门大学2016年高等代数考研试题参考解答
- sizeof 数组_简单的一维数组竟然有这么多坑?
- 并查集算法c语言版,并查集及其C程序实现.doc
- http中的请求头各部分都是什么意思_硬核!30 张图解 HTTP 常见的面试题
- Spring 的application.properties项目配置与注解
- SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
- word 中 给日文汉字标注假名 。 ( ルビ )
- Linux安装mysql5.7.35
- iOS Swift 绘制PDF,超长字符串分页绘制
- 老司机心得之时间管理入坑
- [网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
- html5游戏 搭积木,搭积木游戏,搭积木游戏创意名字
- 2、Terraform-安装
- 基于LBS任务式旅游APP
- C/C++植物大战僵尸之CE找基址+修改器制作(基础版)
- 进不去系统rpc服务器不可用,WinXP系统RPC服务器不可用怎么办?
- socket通信之bind函数
- 初学爬虫-笔趣阁爬虫
- java分哪几部分_Java体系主要分为三部分,下列哪个选项不是其中的一个组成部分?...
热门文章
- SpringBoot实战教程(8)| 整合mybatis-plus
- EclipseLink+H2 快速搭建JPA开发环境
- [Ext JS]Grid的列过滤
- [Spring+Hibernate系列]1.Spring+Hibernate 框架搭建
- Soul 网关源码阅读(三)请求处理概览
- ios怎么创建html文件夹,ios 创建html文件
- java格式化时间博客园_Java 日期格式化工具类
- android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)
- 2021-08-12
- java抽象类及其派生类_java抽象类