
并查集
wanherun
今天会有好事发生吗
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
loj6157 A^B Problem
题目树上一条路径上边权的异或,显然相当于两个到根的异或再异或起来。 这样,相当于我们每次都知道到根的异或值。这样我们就可以并查集处理了,记录到根的异或值,每次判断一下就好了。#include<bits/stdc++.h> #define N 500000 using namespace std; int T,n,m,x,y,f[N+5],w[N+5],z,flg; int u[N+5],v[N+原创 2018-01-27 08:38:18 · 410 阅读 · 0 评论 -
bzoj4668 冷战
题目好久没写blog了,可能是因为最近比较忙吧,距离noip2017也就60个小时左右了吧。要开始复习一下模板了。这道题问是否联通,显然要用并查集来做,但是,是否能路径合并呢? 简单想一想,当然不能啦,因为我们每个结点上要记录一个时间标记,然后构成一个像树一样的结构(当然可能有其它做法)。但是,裸的并查集会超时的,如何优化呢?并查集主要优化就两个:路径压缩和按秩合并,前者接近O(n),后者能让高度原创 2017-11-08 22:43:36 · 486 阅读 · 1 评论 -
bzoj1370 [Baltic2003]Gang团伙
题目noip既视感。显然并查集。我们拆点,吧a拆成a与a’,如果是’F’的话,a与b连,否则,a与b’,a’与b。这样就好了。#include<bits/stdc++.h> #define N 5000 using namespace std; int m,n,x,y; int f[N+1],ans,tmp[N+1]; char ch; inline char nc() { static原创 2017-09-24 20:44:45 · 291 阅读 · 0 评论 -
bzoj2054 疯狂的馒头
题目区间操作,首选线段树,但是这道题显然不可行。怎么办,我们考虑如果从后往前的话,一个数最多被修改一次,并查集就派上用场了。看代码#include<bits/stdc++.h> #define N 10000000 using namespace std; int n,m,p,q; int f[N+1],a[N+1]; inline char nc() { static char buf[1原创 2017-09-24 20:41:08 · 292 阅读 · 0 评论 -
bzoj3732 Network
题目貌似又是一道模板题,kruskal重构树233,合并时按秩合并,深度最多logn,这样以后,连倍增都可以不要,直接走就好了。#include<bits/stdc++.h> #define N 15000 #define Max(x,y,z) max(max(x,y),z) using namespace std; int n,m,k,num,x,y; int f[N+1],siz[N+1]; i原创 2017-09-09 16:19:11 · 223 阅读 · 0 评论 -
bzoj4195 [Noi2015]程序自动分析
题目我居然会做noi的题目233。还是比较简单的了,先把所有相等的用并查集放在一个集合中,最后再判断不相等的是否在同一集合中。由于数很大,我们应该先离散化,不过n<=1000000排序有点卡吧,所以我们尝试用map来记录父亲。#include<bits/stdc++.h> using namespace std; #define N 1000000 map <int,int> f; int p[N+原创 2017-08-31 07:42:06 · 288 阅读 · 0 评论 -
bzoj1015 [JSOI2008]星球大战starwar
题目联通快嘛,就用并查集。正着不好处理,反着来十分方便。这也是并查集的一种基本用法啊。#include<bits/stdc++.h> #define N 200000 using namespace std; int f[2*N+1]; int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int m,n,x,y; int q,A[2*N原创 2017-08-31 07:38:33 · 215 阅读 · 0 评论 -
bzoj1202 [HNOI2005]狡猾的商人
题目判断真假,直觉说:并查集,so就并查集吧。每个节点记录到父亲的查,合并时简单修改一下就好了。#include<bits/stdc++.h> using namespace std; int T,n,m,l,r,w,flag; int f[101],cnt[101]; inline int find(int x) { if(x==f[x])return f[x]; int tmp=原创 2017-08-29 07:41:25 · 356 阅读 · 0 评论