本日主要内容是并查集和堆。
  1. 并查集
并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题。一个并查集支持三个基本功能:合并、查找和判断。举一个通俗的例子,我和lhz认识,lhz和hzc认识,那么也就可以断定我和hzc认识。
依照并查集的思想,我们把所有要待处理的元素a1,a2,a3....an这n个元素都看作是一个单独的集合,初始状态每个集合都只有一个元素。我们就可以把并查集的合并操作理解为集合之间的取并集操作。
作为一个树形结构,在一个由许多这样的集合构成的森林中,每个集合都应该有它自己的「代表元素」,即能够代表一整个集合的所有元素的元素。可以这样理解,在一个地方存在着许多黑恶势力,而每个黑恶势力都有一个自己的头目,这个头目就是集合里的「代表元素」。对于并查集,每个集合选择哪个元素作为代表元素不是我们要关心的问题,但是我们要保证这个代表元素要在集合不发生改变的状态下是不变的,换句话说,不能随便换头目。
那么这应该怎么操作呢?
对于一棵树,我们通常使用一个father数组记录某点的父亲节点,即用father[i]表示第i号点的父亲节点是谁。但是对于并查集,这个father数组则就是用来记录第i个点所在的集合的「代表元素」。
则初始化一个并查集的代码就明确了。
for (int i=;i<=n;i++)
father[i] = i;
下面介绍查找代表元素的find操作。find的作用是查找一个节点x所在集合的代表元素。
int find(int x){
if (father[x] == x)
return x;
else
return find(father[x]);
}
它使用了递归。可以想象一个暴力爬树的过程,如果我现在在i号节点,我为了要找到我们这个集合的代表元素,我肯定要沿着我的father向上爬,直到我找到一个元素,它的father是它本身,那么这就一定是那个黑恶势力的头目了。
时间复杂度O(h),h代表这个点距离代表元素的高度。
 
*路径压缩
我们考虑极端情况。如果有一个集合的某个链非常非常长,而我们要找到这个集合最下边的代表元素的话,是需要O(h)时间的,这个h有可能会非常大,如果再这样使用暴力爬树的方法就会吃到一个TLE。
不怕,我们有路径压缩!
路径压缩的思想非常简单,我在find的时候不是要不断地找祖先吗,那如果所有节点都几乎直接插在代表元素节点不远处,查找的次数不就大大变少了?说的再通俗一点,就是把一条路上的节点的father全部更新成真正的代表元素,而不是合并之前的代表元素,这就相当于是直接把这个地方插到代表元素上,所以就大大减少的查找的递归次数。
还是听不懂?Shut up and take my code!
int find(int x){
if (father[x] == x)
return father[x];
father[x] = find(father[x]);//如果当前节点的father并不是代表元素,那就递归地更新老祖宗
return father[x];//返回老祖宗
}
这个函数的时间复杂度是O(α(n)),α(n)代表反阿克曼函数,反阿克曼函数时一个增长非常缓慢的函数,通常来说,反阿克曼函数的最大值不会超过4,所以路径压缩的find完全可以看作是一个O(1)的常数操作。
     各位读者可以尝试画一下图,可以发现,路径压缩之后的并查集是“类菊花形”的。     
 
合并集合:只需要把一个头目变成另一个头目的下属就可以了。
void merge(int x,int y){
x = find(x);
y = find(y);
father[y] = x;
}
判断两个元素是不是在同一集合,只需要问问他们的头目是谁就知道了。
bool check(int x,int y){
x = find(x);
y = find(y);
if (x==y)
return true;
else
return false;
}
很简单吧,是不是?
 
并查集的应用:kruskal算法求图上的最小生成树。
这里我先卖个关子,等我写到Day3 图论时再去详细介绍这个算法,它并不难理解。
 
例题:
T1:程序自动分析
luoguP1955.
离散化+并查集可做。所谓离散化就是把输入时相同的内容都去掉,可以用map,hash或者unique函数等等操作……我应该会在后面的一篇随笔上详细的介绍离散化操作,这里只是给一个粗略的思想。对于这个题我们可以用并查集维护所有数之间的相等关系。先处理所有的等式,将等式两边的两个数所在的集合合并在一起。然后我们检查所有的不等式。如果某个不等式两边的数字在一个集合中(被要求相等),则输出NO。不存在这样的情况则输出YES。
用两个并查集分别记录相等和不等关系好像也是可以的。
此外,这道题在Day1上午的模拟赛上也出现了。
 
T2:Connect
(我在luogu上找不到这题)
给定一个点数为

夏令营讲课内容整理 Day 2.的更多相关文章

  1. 夏令营讲课内容整理 Day 7.

    Day7是夏令营的最后一天,这一天主要讲了骗分技巧和往年经典的一些NOIP试题以及比赛策略. 这天有个小插曲,上午的day7T3是一道和树有关的题,我是想破脑袋也想不出来,正解写不出来就写暴力吧,暴力 ...

  2. 夏令营讲课内容整理 Day 3.

    本日主要内容是树与图.   1.树 树的性质 树的遍历 树的LCA 树上前缀和   树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的.   回到题目上,如果题 ...

  3. 夏令营讲课内容整理Day 0.

    今年没有发纸质讲义是最气的.还好我留了点课件. 第一次用这个估计也不怎么会用,但尝试一下新事物总是好的. 前四天gty哥哥讲的内容和去年差不多,后三天zhn大佬讲的内容有点难,努力去理解吧. 毕竟知识 ...

  4. 夏令营讲课内容整理 Day 6 Part 3.

    第三部分主要讲的是倍增思想及其应用. 在Day3的整理中,我简要提到了倍增思想,我们来回顾一下. 倍增是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想,它在变化规则相同的情况下,加速 ...

  5. 夏令营讲课内容整理 Day 6 Part 2.

    Day 6的第二部分,数论 数论是纯粹数学的分支之一,主要研究整数的性质   1.一些符号: a mod b 代表a除以b得到的余数 a|b a是b的约数 floor(x) 代表x的下取整,即小于等于 ...

  6. 夏令营讲课内容整理 Day 6 Part 1.

    Day6讲了三个大部分的内容. 1.STL 2.初等数论 3.倍增   Part1主要与STL有关. 1.概述 STL的英文全名叫Standard Template Library,翻译成中文就叫标准 ...

  7. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  8. 夏令营讲课内容整理 Day 4.

    本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...

  9. 夏令营讲课内容整理Day 1.

    主要内容是栈和队列. 1.  栈 运算受到限制的线性表.只允许从一端进行插入和删除等操作.这一端便是栈顶,另一端便是栈底. 其实可以把栈想象层任何有底无盖的柱状的容器...毕竟栈满足后进先出的特性.计 ...

随机推荐

  1. Sublime Text 3.0版本的傻瓜式汉化步骤

    Sublime text 3是非常好的文本编辑器,在试用过N款文本编辑器(Notepad.Notepad++.Notepad2.Programmer's notepad.EditPlus,Vim, T ...

  2. TCP 和 UDP

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  3. Android按下home键后重新打开app进入主activity的问题

    问题阐述: 当我们写一款App的时候,势必会有这种情况:用户已经进行了多级的操作,现返回栈中已存在多个activity,那么这个时候我们想回到最初的activity难道要一层层的返回吗,对用户来说 无 ...

  4. 记录idea maven项目打包部署web项目mapper扫描失败

    最开始以为这里出了问题,后来加上以后还是不能把mapper.xml打包进去 这是报的异常信息 Mybatis启动老是报绑定错误(找不到Mapper对应的 SQL配置),经过一番Google未能解决问题 ...

  5. include指令与include动作的区别(面试要考)

    include指令: 语法格式:<%@ include file=" " ...%> 发生作用的时间:页面转换期间 包含的内容:页面的实际内容 转换成的servlet: ...

  6. 访问网时出现403 Forbidden错误的原因:

    1.你的IP被列入黑名单.2.你在一定时间内过多地访问此网站(一般是用采集程序),被防火墙拒绝访问了.3.网站域名解析到了空间,但空间未绑定此域名.4.你的网页脚本文件在当前目录下没有执行权限.5.在 ...

  7. 解Linux SSH命令大全,新手必看SSH命令

    下面介绍一些基本的常用的Linux SSH命令,都是一些很简单的Linux SSH命令,新手掌握了这几个,一般管理一般的vps或者linux主机就可以了!     我们的教程介绍了putty的使用方法 ...

  8. Python3 字符串格式化

    1.字符串的格式化: 按照统一的规格去输出成为一个新的字符串 2.字符串格式化的方法: 1)format方法 fomat()有两个参数位置参数和关键字参数用中括号括起来{ } #{0}{1}为位置参数 ...

  9. 版本控制——TortoiseSVN (3)多版本发布

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  10. 【问题解决】Eclipse中 ctrl+空格 content assist

    改一下你的快捷键设置:window->perferences-->keys--->查找 content assist--->把这个地方改成你想要的就可以了.!