说句实话,我和并查集的缘分还是蛮深的,因为当年学完数论想着找板子题乱做(真是个神奇的找题方式呢),然后就看到了并查集QWQ,看了一会发现是图论就不看了,,,,,,结果还被说是大佬QWQ其实我只是个NaCl Fish而已QAQ

好了现在终于学了并查集,那我们就来总结总结

这一次总共是有三道题要讲

首先我们来看看板子题

P3367 【模板】并查集

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。 (摘自百度)

所谓并查集,其实就是并       查         集        这一点看题面就能理解了

这里看一下   并(把两个集合合并到一起)

void merge(int a, int b)
{
father[search(a)]=search(b);
}

这里看一下    查(查一个点的祖宗是啥)

int search(int a)
{
if (father[a] == a)
return a;
return father[a] = search(father[a]);
}

这里形象的理解一下(某谷题解)

关于并查集和路径压缩:

有a,b,c三个人

假设a和b打架了,a做了b的小弟。则令f[a]=b;

后来a打赢了c

那么c就是a的小弟了。所以,令f[c]=a;

但是,c不知道b,这不符合要求。

所以,我们必须让c的大哥变成最大的老大。

这个就是查的过程

int search(int a)
{
if (father[a] == a)
return a;
return father[a] = search(father[a]);
}

这里我用了一个比较好的优化技巧,就是在找一个点的祖宗的时候,一块把所有经过的点的祖宗都进行标记,这样就比较快了,看一下代码的话,也是赋了一个递归函数的返回值。这样的话找爹就更容易点了

代码贴一下

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, x, y, z, father[], t1, t2;
int search(int a)
{
if (father[a] == a)
return a;
return father[a] = search(father[a]);
}
void merge(int a, int b)
{
father[search(a)]=search(b);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i)
father[i] = i; for (int i = ; i <= m; ++i)
{
scanf("%d%d%d", &z, &x, &y);
if (z == )
merge(x, y);
else
{
if (search(x) == search(y))
printf("Y\n");
else
printf("N\n");
}
}
return ;
}

那么我们看下一个题

P1551 亲戚

这个题吧其实也算得上是一道并查集的板子题了,主要的就是分析一下要你干什么

我们来看看

,首先,我们假设每一个人都是一个独立的集合,在他输入两个人之间是亲戚关系的时候,我们就需要把这两个人所在的集合合并了,还是用到了上面的代码

这里边读入边合并,最后直接输出找爹结果就行了(还是挺水的)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, x, y, z, father[], p;
int search(int a)
{
if (father[a] == a)
return a;
return father[a] = search(father[a]);
}
void merge(int a, int b)
{
father[search(a)] = search(b);
}
int main()
{
scanf("%d%d%d", &n, &m, &p);
for (int i = ; i <= n; ++i)
father[i] = i;
for (int i = ; i <= m; ++i)
{
scanf("%d%d", &x, &y);
merge(x, y);
}
for (int i = ; i <= p; ++i)
{
scanf("%d%d", &x, &y);
if (search(x) == search(y))
printf("Yes\n");
else
printf("No\n");
}
return ;
}

最后一个题是这货

P3984 高兴的津津

这个题的标签是这样的

所以蒟蒻我一开始只是用数学方法做的啊QWQ

讲讲数学加模拟的实现吧

首先我们知道津津AKIOI之后会开心t天,但是在这t天以内,如果她再次AK,那么时间从头算起,这样的话,我们就可以比较每两个数的差,看是否大于t并且进行运算啦

贴代码,跑路~

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, t, a[], ans;
int main()
{
scanf("%d%d", &n, &t);
for (int i = ; i <= n; ++i)
{
scanf("%d", &a[i]);
if (i != )
{
if (a[i] - a[i - ] > t)
ans += t;
else
ans += a[i] - a[i - ];
}
}
ans += t;
printf("%d", ans);
return ;
}

并查集(我根本不会切板子啊喂QWQ长文)(大雾的更多相关文章

  1. CF # 296 C Glass Carving (并查集 或者 multiset)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. TZOJ 3042 切蛋糕(并查集)

    描述 KK是个心灵手巧的好姑娘,她做了一个大蛋糕请她的好朋友们来品尝.这个蛋糕分成n×n个正方形小格,每个小格包含一块水果.KK要把蛋糕切成若干块,显然她不会破坏任意一个小格.无聊的某同学在她切蛋糕时 ...

  3. [poj-2985]The k-th Largest Group_Treap+并查集

    The k-th Largest Group poj-2985 题目大意:给你n只猫,有两种操作:1.将两只猫所在的小组合并.2.查询小组数第k大的小组的猫数. 注释:1<=n,m<=20 ...

  4. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  5. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  6. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  7. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  8. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. [bzoj3910]火车_并查集_倍增LCA

    火车 bzoj-3910 题目大意:给定一棵n个节点的树,你需要顺次经过m个互不相同的节点,如果一个节点在之前的路径上被经过过,它不必再被特意经过.问走过的路径长度. 注释:$1\le n\le 5\ ...

随机推荐

  1. .Net Linq与Lambda表达式中GroupBy以多个字段分组

    一.引入 基本上熟悉C#语言的没有不知道Lambda表达式的,其对于数据的处理真的是太方便了.其中分组处理的GroupBy方法在List中的使用非常广泛.正式近期一个功能需求中又遇到了,而且是需要Gr ...

  2. 用jQuery做一个选项卡

    1.首先我们点击选项卡的标题栏来改变内容

  3. Gerrit系统框架介绍

    Gerrit目录介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79889242 先上图 bin/ : 主要是放gerrit.sh启 ...

  4. 《PHP制作个人博客》之四:分类添加及前端导航数据用php动态调取

    大家好,今天我们接着上一节的全栈营销个人博客制作,上一节我们把博客的模板给加载运行起来.今天我们主要讲解后台模板分类的添加,后台导航的添加,及前台导航的动态调用.一个好的博客,导航很重要,导航就像你网 ...

  5. ARDC连接设备异常之ADB version mismatch的处理

    如果ARDC提示ADB version mismatch,说明系统当前运行的adb server与client不匹配.此时如果在cmd.exe中运行adb devices命令则会出现类似如下的提示信息 ...

  6. 关于Android Studio 3.2 运行应用时提示 “Instant Run requires that the platform corresponding to your target device (Android 7.0 (Nougat)) is installed.” 的说明

    点击"Run",运行App后,Android Studio显示如图1-1界面: 图1-1 这是因为你连接的外部设备(比如Android手机或AVD)的SDK版本在你的电脑上没有安装 ...

  7. 使用免费 mongodb数据库 + 免费node.js服务器搭建小程序接口

    由于微信的小程序只支持不带端口的域名接口,不支持IP地址和接口,所以我们需要映射到80端口并绑定备案过的域名才能被微信小程序访问到.简单点就是接口需要 https 协议才行,找了许久的免费的数据库与n ...

  8. 基于FPM制作nginx RPM包

    目录 环境 配置 FPM安装 环境 系统 其它 CentOS 7.5 需提前配置好epel 配置 [root@localhost ~]# yum clean all && yum ma ...

  9. 阿狸V任务页面爬取数据解析

    需求: 爬取:https://v.taobao.com/v/content/video 所有主播详情页信息 首页分析 分析可以得知数据是通过ajax请求获取的. 分析请求头 详情页分析 详情页和详情页 ...

  10. 修饰符-static

    一.static静态修饰符 static修饰符能够修饰属性,方法,初始代码块,不能修饰局部变量和类. 静态的变量叫常量,非静态的变量叫实例变量. 1.修饰属性 package gc.test.java ...