
并查集
TSOI_Vergil
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
BZOJ 1202 并查集
首先我们定义sum数组,sum[i]为[father[i],i)区间的和,对于一条信息,我们需要把闭区间转化成左闭右开区间,因为闭区间会割裂一些区间的联系,比如[1,2]和[3,3]是连通的区间,但是在程序中就会被判断成不连通。对于每个信息s,t,v,我们可以分两种情况,当s与t的祖先相同时,判断是否满足sum[t]-sum[s]=v,当祖先不同时,将他们的祖先合并,sum数组的维护体现在并查集的原创 2016-08-16 15:09:07 · 287 阅读 · 0 评论 -
食物链 并查集
食物链可以说是一道非常经典的种类并查集问题,我们定义偏移量的概念,类似于向量,当fx-->x=1表示fx吃x,fx-->x=2表示x吃fx,fx-->x=0表示x于fx是同类,用一个数组flag[i]记录,表示i的祖先到i的偏移量,则题目中需要我们维护或判断x-->y的偏移量是否是opt-1,定义x的祖先为fx,y的祖先为fy,则如果合并fx与fy,fx-->x-->y-->fy,即flag[fy原创 2016-08-16 16:11:50 · 302 阅读 · 0 评论 -
BZOJ 1015 并查集
首先正常的想法,用并查集维护当前图的连通性,当某一节点被摧毁后,将与其相连的边删除,判断连通性是否有变化,更新答案。但是比较麻烦的是并查集不支持删除操作,那怎么办呢,我们可以逆向思维,将删除点的过程转化成添加点的过程,这样就能用并查集维护了。#include#include#includeusing namespace std;#define maxn 400005int last[ma原创 2016-08-16 17:38:16 · 325 阅读 · 0 评论 -
LUOGU 1196 并查集
我们可以用并查集维护一些东西,考虑到并查集的根节点一定是某一列的第一个值,那么我们可以维护一个sum数组,用来记录i到i祖先的战舰数,同时需要维护一个num数组,num[i]表示第i列的战舰总数#include#include#includeusing namespace std;#define maxn 30005int sum[maxn],father[maxn],num[max原创 2016-08-16 19:02:06 · 411 阅读 · 1 评论 -
BZOJ 1854 并查集
这道题和BZOJ上的1191的题目类型差不多,都可以用二分图匹配来做,但是这题的数据范围很大,匈牙利算法的最坏复杂度是N^2的,会TLE,因此我们考虑换一种算法。 我们可以用并查集来维护一些信息,令flag[i]表示值为i的这一次能否通过,我们一个装备当成一条边,连接着两个数值,那么在并查集中它们是一一棵树的情况存在,树是n个点,n-1条边的连通图,那么我们只能选n-1个数值,根结点无法原创 2016-08-17 18:09:14 · 346 阅读 · 0 评论