
数据结构-并查集
Endless_Way
这个作者很懒,什么都没留下…
展开
-
POJ 1182 食物链
带权并查集,点权表示自己与父亲的关系,0同类,1被父亲吃,2吃父亲。这样记可以很方便地转移关系,可以证明关系转移的表达式:自己和爷爷的关系=(自己和父亲的关系+父亲和爷爷的关系)mod 3路径压缩,判断假话,都要用到这个转移式。#include<cstdio>#define MAXN 50005int n;struct animal{ int fa, r;}ani[MAXN];v原创 2016-08-05 16:03:52 · 202 阅读 · 0 评论 -
BZOJ 1050 [HAOI2006]旅行comf
排序+贪心按边权排序,枚举权值最小边,贪心地从小到大选取比最小边大的边,用并查集维护连通性#include<cstdio>#include<algorithm>#define M 5005#define N 505using namespace std;struct edge{int a,b,v;}e[M];const int INF=30005;int fa[N];bool cmp原创 2016-09-25 13:35:23 · 355 阅读 · 0 评论 -
BZOJ 1854 [Scoi2010]游戏
并查集 或 二分图匹配这题复杂度错误的算法竟然跑得比正解快 错误的算法(1):用装备的两种属性向装备连边,跑二分图匹配即可,注意题目要求是连续攻击,所以一旦匹配不成功就要退出正确的算法(2):把每一个装备考虑成一条边,它的两个属性考虑成边两端点的编号。使用装备相当于删除这条边。于是可以发现如果某连通块图中有环,那么环上的点必定都可以取到。如果是树结构,让编号最大的取不到即可。二分图匹配#includ原创 2016-09-25 14:48:13 · 424 阅读 · 0 评论 -
BZOJ 4195 & UOJ 127 [Noi2015]程序自动分析
并查集出现矛盾当且仅当x1=x2且x1!=x2于是先处理所有等于,把两个数用并查集并起来,对于每一个不等于判断一下就好了NOI为什么会有这种题。。。#include<map>#include<cstdio>#include<cstring>#include<algorithm>#define N 100005using namespace std;int a[N], b[N], c[N]原创 2016-09-25 15:26:56 · 365 阅读 · 0 评论 -
BZOJ 2959 长跑
LCT+缩边双+并查集 显然如果进入一个边双联通分量,那一定能取遍所有点再出来.于是只要维护边双即可.对于加边,需要缩点,用LCT即可,判断是不是在一个边双里用个并查集就行. 此题时限比较紧.注意到在缩点之后,LCT上的操基本只有access需要查询真实父亲(因为缩点之后的点单独属于一个分量),其他操作并不需要查并查集.把这个优化掉就能过了...?#include<cstdio>#include<原创 2017-02-08 23:25:55 · 328 阅读 · 0 评论 -
BZOJ 4569 [Scoi2016]萌萌哒
ST表+并查集一个直观的想法是把[l1,r1],[l2,r2][l_1,r_1],[l_2,r_2]对应位置的元素并起来。若最后有cntcnt个集合,则答案就是9∗10cnt−19*10^{cnt-1},复杂度O(nm)O(nm),考虑优化它。实际上我们是在进行区间操作,那我们对区间进行维护。用ST表,记id[i][j]id[i][j]表示[i,i+2j−1][i,i+2^j-1]这一段节点。两段区原创 2017-02-12 21:08:02 · 309 阅读 · 0 评论 -
BZOJ 4243 交朋友
并查集O(答案)O(答案) 复杂度的算法肯定都没法过,考虑这题的性质。一不小心想到,如果同时存在(p,p1),(p,p2),…,(p,pn),那么p1,p2,…,pn之间就会形成完全子图。那我们第一步先用并查集把他们缩起来。考虑缩完之后还会有贡献的点对a,b,一次是存在c点,满足(c,a)是新边,(c,b)是旧边,(如果都是新边则已经都在一个完全子图里了)。还有一个性质是一个大于1的完全子图内的点引原创 2017-02-02 16:59:10 · 480 阅读 · 0 评论 -
BZOJ 2303 [Apio2011]方格染色
易或方程+带权并查集我好SB啊,挂题解吧。。。。。。 http://www.cnblogs.com/HHshy/p/5840018.html#include<cstdio>#include<cstring>#define N 2333333#define MOD 1000000000#define R registerusing namespace std;namespace runz原创 2017-03-06 17:15:31 · 441 阅读 · 0 评论 -
BZOJ 4537 [Hnoi2016]最小公倍数
暴力的做法是把所有两维边权不大于询问的边用并查集做一下,查询两点是否连通以及连通块内有没有询问的值。 这是二维关系,显然我们会想到对第一维排序,动态地维护第二维。如果每一次都重建一下是不科学的,我们要维护图的连通性或者减少重建。二维关系不资磁线段树分治,所以不太好维护图的连通性,考虑减少重建次数,那就分块重建……把边分成根号块,每一次处理第一维在块内的询问。对于块前的边按第二维单调扫,块内暴力查。原创 2017-03-25 00:13:56 · 386 阅读 · 0 评论