![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
L_0_Forever_LF
一个热爱OI的OIer
展开
-
BZOJ4229: 选择
Orz liaoliao 首先把时间轴翻转,把删边操作变成加边操作 然后处理原来就在的边和所有加边操作,建一棵生成树,非树边就先不建上去再处理原来就在的非树边和加的非树边及询问, 如果是加一条边,将它连接的两点的路径上所有点并在同一个并查集 如果是询问,两点在同一个并查集,就是Yes,否则No 正确性的话,因为如果这个询问之前这两点之间不存在两条路径,就算将这个询问之后的边提前建出来了,两原创 2017-04-26 09:36:43 · 623 阅读 · 0 评论 -
BZOJ1098: [POI2007]办公楼biu
题目说如果两点不在一个集合,那么他们之间一定有边,问最多有多少个集合 建出反图后,模型转化,变成如果两点不在一个集合,那么他们之间一定没有边,也就是说,两点之间有边就一定在一个集合 就相当于问反图有多少个联通块和每个联通块大小如果在反图上直接暴力,枚举每个点,将他连的点加进来,复杂度是n^2 但是其实一个点被访问过了就没有必要再找他了,可以用一个并查集将他和i+1并在一起,每个点找相连的点时,原创 2017-09-23 20:48:45 · 247 阅读 · 0 评论 -
BZOJ1104: [POI2007]洪水pow
因为海拔底的水泵可以兹瓷抽海拔高的地方的水,所以我们按海拔高度从小到大处理每个小正方形 处理每个小正方形时,将它和相邻的不比他高的区域合并成一个联通块,因为他的水可以流到这些区域,每个高度合并完后,看这个高度的属于城市的区域,如果所在的联通块已有水泵,则这个水泵可以为这个区域抽水,否则需要给它所在的联通块增加一个水泵 注意有100w个元素,不能排序,因为高度不超过1000,每个高度开个vecto原创 2017-09-24 19:50:25 · 336 阅读 · 0 评论 -
codeforces 891C
给出一个无向图,每次询问图中的一个边集,是否存在包含这个边集的MST考虑怎么判断是否存在包含某一条边的MST 若他不在原图的MST上,显然只能尝试用它替换一条权值相等的,MST上的边 设他的权值为c,可以先对权< c的边先做kruskal建出生成树,用这些边将原图缩点 然后若这条边在这个缩完点的图上不是自环,就合法对于每个询问的边集,不同的边权显然互相独立 这个边集合法的充要条件是每条边合法原创 2017-11-19 17:15:00 · 779 阅读 · 0 评论 -
BZOJ1119: [POI2009]SLO
建一个n个点的图,若ax在b中的位置是y,就连一条x->y的边,每次可以交换两个出度,代价是wx+wy,问让所有边连成自环的最小花费每个环显然选出最小的wx顺着环换,也可以额外花费一些,和其他环并在一起,用其他环的wx换 判一下就行了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#i原创 2017-12-11 16:22:17 · 284 阅读 · 0 评论 -
BZOJ3521: [Poi2014]Salad Bar
维护p-j的前缀和sum[i],那么一段l~r合法的充要条件是sum[l]<=sum[l~r],sum[r]>=sum[l~r],即中间的所有sum都>=sum[l],<=sum[r] 如果枚举了右端点r,i为r左边第一个i满足sum[i]>sum[r] ,令L=i+1,问题变成找L~r的sum最小值 可以rmq,用并查集离线做rmq可以O(n),具体来说,维护每个位置i~r的rmq,那么1~r原创 2017-11-23 18:25:41 · 358 阅读 · 0 评论 -
BZOJ2811: [Apio2012]Guard
先将序列中不可能有忍者的位置标出来 如果剩下的位置恰好有K个,要特判直接全部输出然后将每个区间缩掉两端的0 如果存在某两个区间A,B,A包含B,那么A是不必要的 处理完后剩下的区间两两互不包含,按右端点排序后,从左到右左右端点递增 易知只有每个区间的右端点有可能一定有忍者,因为贪心的放肯定是放右端点更优用f[i]表示保证了1~i区间的限制最少需要几个忍者,g[i]表示保证了i~n的区间限制至原创 2017-12-05 11:14:04 · 281 阅读 · 0 评论 -
BZOJ3847: ZCC loves march
每个点如果不考虑被分裂出去,他至多只会被合并一次,维护两个set,每次合并可以暴力找出这一行/列的所有点,并查集资瓷一下合并成一个点,每次分裂可以直接新建一个点代表这个分出去的点code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>原创 2018-01-03 12:29:17 · 429 阅读 · 0 评论 -
BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫
一个位于(i,j)的守卫只能控制i行或者j列 我们将这样的一个守卫视为连接i,j的一条无向边,那么我们的目标就是选出花费最小的一组边,使得对每条边定向后,每个点的入度恰好为1 那么对于每个联通块,他就是一个基环外向树,要求花费最小,类比最小生成树的建树过程,建一个最小生成环套树森林qaq 正确性的话….脑补一下?我也没有仔细去想证明qaqcode:#include<set&...原创 2018-03-19 22:04:11 · 330 阅读 · 0 评论