洛谷P2024 [NOI2001]食物链

题目描述

食物链 - 洛谷

\(n\le5*10^4\)

\(k\le10^5\)

Recollection

初中的时候想了一个假掉了的算法想了很久。

刚刚突然想起自己几次尝试这道题的想法有多么无知。

空を辿る路 足跡一つでも

追寻着天空的路上 只存留着我的足迹

この時のはてに貴方が若し居るなら

如果这个时候有你在我身旁的话

少しだけで好い 彷徨う私にも

哪怕只有一点点 即使是处于彷徨中的我

彼方から風の唄を届けて

也听见了从远方传来的风之歌

然后突然有点怆然……

Solution

先说那时的想法为什么假了吧。

只新开三个拓展的节点\(A=50011\),\(B=50012\),\(C=50013\)。

每次判断一个动物属于哪一种就看getf(i)==getf(A/B/C)

当然,这是胡思乱想。因为很显然,每个动物没有实际的值\(ABC\),当然不能用这个来判断。

若第一个输入的点对就假设有一个为\(A\)种,也无法维持后续的间断的传递关系。

\(\dots\dots\)

还是不多说过往的愚昧了吧。


因为有三种动物,故开\(3*n\)的并查集。

这个并查集看作有三个维度,每一维都可以看做我们想要的主集。

那么为什么还要3倍的并查集呢?

因为除了想一般的并查集那样维护直接的传递关系,还要维护不同集合之间的传递"不在同一个集合"的关系。

那么结构上像极了余弦定理

\[a^2=b^2+c^2-2bc*cosA\\
b^2=a^2+c^2-2ac*cosB\\
c^2=a^2+b^2-2ab*cosC
\]

而我们的种类并查集也一样。

若\(x\),\(y\)属于同一集合,那么

\[f_x=f_y\\
f_{x+n}=f_{y+n}\\
f_{x+n+n}=f_{y+n+n}
\]

若\(x\)吃\(y\),那么

\[f_{x+n}=f_y\\f_{x+n+n}=f_{y+n}\\f_{x}=f_{y+n+n}
\]

美妙的三元变换呢!(雾

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
using namespace std; template<class T>inline void read(T&x)
{
char ch=getchar();
int fu;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
x*=fu;
}
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
int f[50010*3];
int n,k,ans;
int getf(int x)
{
if(x==f[x]) return x;
return f[x]=getf(f[x]);
}
void merge(int x,int y)
{
x=getf(x);
y=getf(y);
f[x]=y;
}
bool ask(int x,int y)
{
return getf(x)==getf(y);
}
int main()
{
n=read();
k=read();
for(int i=1;i<=n*3;i++) f[i]=i;
while(k--)
{
int op,x,y;
cin>>op>>x>>y;
if(x>n||y>n)
{
ans++;
continue;
}
if(op==1)
{
if(ask(x,y+n)||ask(x+n,y)) ans++;
else
{
merge(x,y);
merge(x+n,y+n);
merge(x+n+n,y+n+n);
}
}
if(op==2)
{
if(ask(x,y)||ask(x,y+n)||ask(x+n,y+n+n)) ans++;
else
{
merge(x+n,y);
merge(x+n+n,y+n);
merge(x,y+n+n);
}
}
}
cout<<ans;
return 0;
}

Memories

偶尔做做“水题”,也是不错的吧……但愿……

洛谷P2024 [NOI2001]食物链 种类并查集的更多相关文章

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

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

  2. P2024 [NOI2001]食物链(种类并查集)

    题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...

  3. 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)

    传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...

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

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

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

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

  6. 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护

    先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...

  7. 洛谷 P2024 [NOI2001]食物链

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

  8. Java实现 洛谷 P2024 [NOI2001]食物链

    输入输出样例 输入 #1 100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5 输出 #1 3 import java.util.Scanner; pub ...

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

    大水题一道啊,几分钟切掉. 还是扩展域,每个点拆3个点,之间连边表示有关系(即捕食关系).然后随便判定一下就好了,不难,毕竟NOI上古题目. #include<iostream> #inc ...

  10. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

随机推荐

  1. python 二级 第三方库

    爬虫:rs 1.requests:链接访问 2.scrapy:系统构建.数据挖掘.网络监控.自动化 数据分析方向 nsp 1.numpy :数组 .科学计算.c语言编写 2.scipy:科学.数学.工 ...

  2. 掌握 K8s Pod 基础应用 (一)

    Pod 介绍 Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它 ...

  3. Django的MVT模式和Spring的MVC模式类比

    Spring的MVC模式 MVC: Model-View-Controller 模型-视图-控制器 M: 数据处理 V: 界面显示 C: 逻辑处理 最开始用于Desktop程序开发,现在已被广泛使用, ...

  4. vue浏览器插件及安装

    vue浏览器插件及安装 插件下载: 链接:https://pan.baidu.com/s/1Wu4a4skkJ-i5ccydRnn8qg 提取码:dwux 然后打开浏览器,F12,有这个vue就成功了

  5. 最新活动 ISS 国际空间站 MAI-75 SSTV活动计划于2020年8月4日至5日

    MAI-75  SSTV活动计划于2020年8月4日和5日举行 8月3日至9日这一周的最后宇航员时间表最近公布了,它显示了定于8月4日和5日进行的MAI-75活动.这是在Space X Demo-2脱 ...

  6. macos设置docker可以ping容器

    macos设置docker可以ping容器 项目连接不上seata 今天在启动项目时候seata报错: io.seata.common.exception.FrameworkException: ca ...

  7. etcd和Zookeeper孰优孰劣对比

    背景 最近在看到Pachyderm的介绍时,看到作者拿YARN和Kubernetes做类比,拿Zookeeper和etcd做对比.YARN和Kubernetes的类比还相对比较好理解,毕竟他们都有资源 ...

  8. Zotero设置

    1. 说明 Zotero 中文社区 | 百度网盘 使用 zotero 仅同步题录信息,使用其他云同步程序同步文献的附件,此处以坚果云为例进行演示,前期的坚果云同步设置参考文章:Zotero坚果云同步. ...

  9. 【SpringCloud】微服务架构编码构建

    微服务架构编码构建 约定>配置>编码 Mysql的主从 slave会从master读取binlog来进行数据同步 三步骤+原理图 MySQL复制过程分成三步: master将改变记录到二进 ...

  10. AOP流程及原理

    目录 一.AOP结构介绍 @Pointcut 通知 原理 连接点 拦截器 二.Bean介入点 EnableAspectJAutoProxy AspectJAutoProxyRegistrar Anno ...