题目描述 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到.瓶子的容量可以视作是无限的.吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直到某一反应物耗尽.生成的沉淀不会和任何物质反应.当有多于一对可以发…
[BZOJ3712]Fiolki(并查集重构树) 题面 BZOJ 题解 很神仙的题目. 我们发现所有的合并关系构成了一棵树. 那么两种不同的东西如果产生反应,一定在两个联通块恰好联通的时候反应. 那么,我们按照并查集的合并顺序,类似于克鲁斯卡尔重构树的方法构建一个并查集重构树, 发现所有的反应恰好在两者的\(LCA\)处发生, 所以把所有可以发生的翻译拿出来, 按照\(LCA\)的深度为第一关键字,反应的优先级为第二关键字排序. 然后按顺序依次计算答案就好了. #include<iostream…
Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事情. kruskal求最小生成树的过程,如果把加入的一个边新建一个节点的话,并且把k1,k2的father设为新点的话,会得到一个2*n大小的树 实际上已经非常明白地表示kruskal这个过程了.这个树叫kruskal重构树 每个点的权值定义为所代表的边的权值.叶子节点权值最优. 由于贪心,所以树上所有点,…
克鲁斯卡尔重构树 又叫并查集重构树 大概在NOI2018之前还是黑科技 现在?烂大街了 主要是针对图上的对边有限制的一类问题 比如每次询问一个点u不能经过边权大于w的边能走到的第k大点权是多少 也就是这个题peaks 首先肯定是一个最小生成树(如果不知道为什么还可以先做货车运输) 我们在并查集合并的时候稍作修改 每次不是fa[x]=y而是fa[x]=fa[y]=++tot 这样相当于新建了一个点连接两棵树,tot的点权根据题目需要确定 peaks这题点权就是所连边的边权 我们发现这样子构出来的树…
3712: [PA2014]Fiolki Time Limit: 30 Sec  Memory Limit: 128 MB Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到.瓶子的容量可以视作是无限的.吉丽知道某几对液体物质在一起时会发生反应产生沉…
原文链接https://www.cnblogs.com/zhouzhendong/p/NOI2018Day1T1.html 题目传送门 - 洛谷P4768 题意 给定一个无向连通图,有 $n$ 个点 $m$ 条边,每条边有两个属性:海拔$(a)$.距离$(l)$. 有 $Q$ 组询问,每组询问两个数 $v,p$,表示询问从点 $v$ 出发,从第一次走海拔高度不超过 $p$ 的边起算,问行走距离最小为多少.(即,在第一次走海拔高度不超过 $p$ 的边之前,走的所有边都是免费的) $T$ 组数据,强…
解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持久化并查集,询问时二分即可. 不能使用路径压缩,应该按秩合并,注意秩是树的深度而不是大小.$O((E+Q)\log^2 N)$ 由于常数过大,基本过不去. 3.考虑优化算法二,发现访问历史版本并不需要修改而只需要询问,所以一开始只使用普通的并查集,用可持久化数组记录并查集的修改情况. $O((N+E…
神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全部丢到优先队列里就行了). 考虑当前站在 \(u\) 点上时,剩余的电量是 \(x\).注意到由于起点是充电站,就一定有 \(x\le c-dis_u\)(考虑最后一个走到的充电站沿最短路走到这) 如果 \(x<dis_u\),因为终点是充电站,肯定不可能再到终点. 否则就可以走到最近的充电站再回来…
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到.瓶子的容量可以视作是无限的. 吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直…
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数表示 N个节点上的权值.  接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分. Output 对于每一个第一类操作,输出一个非负整数表示答…
3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Status][Discuss] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如…
新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1\)个节点的树,这棵树具有许多特殊的性质,可以用来解决许多问题. 那么我们来了解一下这个新算法. Kruscal 先回顾一下\(Kruscal\)算法吧.这是一个经典的图论算法,用于求解无向图的最小生成树. 其算法大致思路为将边用边表的形式储存,按照权值从小到大排序,然后枚举每一条边,尝试连接不在同…
题意:给一张无向联通图,每条边有长度和高度,每次询问在高度大于p的边,从v点能到达的所有点到1号点的最短距离(强制在线) 首先dijkstra求出每个点到1号点的距离 易知:如果我按高度从高到低给边排序然后用kruskal的方法做出一棵生成树,那么在高度大于p的条件下,在原图中联通的两点在生成树中依旧联通 于是就可以在做kruskal的时候建一个叫做重构树的东西,在用并查集维护联通块的同时维护一个树结构: 对于每条边,若原本两端点u,v不连通,则新建一个节点t,设a,b为u,v在并查集中的祖先,…
题目传送门 题意:定义$Tour \, Belt$为某张图上的一个满足以下条件的点集:①点集中至少有$2$个点②任意两点互相连通③图上两个端点都在这个点集中的边的权值的最小值严格大于图上只有一个端点在这个点集中的边的权值的最大值.现在给你一张$N$个点,$M$条边的图,请给出这张图上所有$Tour\,Belt$中包含的点数的和.$N \leq 5000 , M \leq \frac{N(N - 1)}{2}$ 虽然这道题没有必要用$Kruskal$重构树来写,但是考%你赛的时候写$Kruskal…
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海拔. 作为季风气候的代表城市,魔力之都时常有雨水相伴,因此道路积水总是不可避免 的.由于整个城市的排水系统连通,因此有积水的边一定是海拔相对最低的一些边.我们用水位线来描述降雨的程度,它的意义是:所有海拔不超过水位线的边都是有积水的. Yazid 是一名来自魔力之都的OIer,刚参加完ION2018…
闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集Debug到13:20过了前4个样例,然后第5个T飞了. FST? ...... FST! 完美收获50分暴力分. 原来是按秩合并那里咕咕了. 从50到100的蜕变,只需一行,你值的拥有. 思路 不会kruscal重构树 容易发现,假设我们确定了水位线,那么就确定了图中有哪些边是连通的.这时候的答案该…
题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔. 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车经过海拔 \(> p\) 的边,其中 \(\le p\) 的边只能步行,步行后不能继续开车了. 询问它到 \(1\) 号点最少要步行多远. 多组数据.\(n \le 200000~~ m,q \le 400000\) . 题解 一个直观的想法,对于每次询问,我们保留 \(>p\) 的边,然后求出联…
链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 这kruskal重构树的话,看图就明白了 叶子节点都是原树节点 非叶子节点都是边 按照从大到小的顺序依次加边(是深度不是长度) 如果连通块已经在一起就不联通,其他两个最大节点和这个边(新建节点)连边 看图就是很明白 我们发现,重构树的根到任意节点是单调的,也就是说,这是个二叉堆啊 那两点间联通的最小…
今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. $1\leq n\leq 15000,1\leq m\leq 30000,1\leq k\leq 20000$. 我相信你们看见这题的想法和我一样: 货车运输!最小生成树上LCA一下就行了!时间复杂度 $O(m\log m+n\log n+k\log n)$.(这里LCA用倍增.树链剖分复杂度是多…
传送门 新鲜出炉的noi2018试题. 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东. 听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但当我们使用kruskal重构树的时候,对于每次找出的不同的两个连通块的祖先,我们都新建一个点作为两个祖先的父亲,并将当前边的边权转化为新点的点权.然而,路径压缩的时候会让我们丢失这种辛辛苦苦创造的树的形状...因此我们需要在使用并查集维护连通性的同时使用二叉树来维护树的形状.这样维护出来的树就是kr…
题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信息. 离线的思路对满分做法有一定的启发性,很容易想到将并查集持久化一下就能支持在线了. 但是这个是两个$log$的,有卡常的风险也不是很方便写. 当时思考了一下就快速写完离线做法就去做其他题了. 对于这道题,有一个更好的做法:Kruskal重构树. 事实上如果你了解这个东西,那你就能很快的给出解,那…
比较自然的思路是,由于需要记录连通块合并时的信息,所以需要建出Kruskal重构树. 需要用LCT维护,支持加点和在线LCA操作. 不妨考虑在并查集合并的同时记录信息,pre[x]表示x与它的父亲相连的时刻. 两个点连通的时刻,等于两个点之间路径上时刻的最大值. 注意到按秩合并但不路径压缩的并查集不改变树的结构,且树高为log,正好符合要求. $O(n\log n)$ #include<cstdio> #include<algorithm> #define rep(i,l,r) f…
题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ Sol 很显然答案一定在最小生成树上,但是此题还有一个更为玄学的做法—Kruskal重构树 它是在Kruskal算法上改进而来的. 算法流程: 对于此题来说,将边权从小到大排序 用并查集维护两点的联通性,若祖先不相同,那么新建一个节点,权值为边权.左右儿子分别为两个点 这样建出来的树,我们称之为Kru…
kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namesp…
[NOI2018]归程(克鲁斯卡尔重构树) 题面 洛谷 题解 我在现场竟然没有把这道傻逼题给切掉,身败名裂. 因为这题就是克鲁斯卡尔重构树的模板题啊 我就直接简单的说一下把 首先发现答案就是在只经过海拔大于\(p\)的边的情况下,所有点到\(1\)号点中最短路最小的那个点.所以预处理最短路径,构建克鲁斯卡尔重构树,直接倍增+线段树就好了. 还有一种基于离线做法的方法. 我们发现离线做法只需要按照所有询问排序, 然后利用并查集按照海拔高度从小往大合并(这个其实就是克鲁斯卡尔) 这样子就可以利用可持…
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时候感觉掌握的并不熟,还是需要参照别人的题解,不过至少现在对可持久化的理解更深了一步,而且终于这题给调对了. Code: //It is made by HolseLee on 23rd Aug 2018 //Luogu.org 4768 #include<cstdio> #include<c…
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并且他有一部车,车只能在海拔高度大于降水量的道路上行驶,如果某一条边的海拔高度小于等于降水量,那么小\(Y\)就必须下车步行,现在有\(q\)次询问,每次询问从目标点到\(1\)要步行的最短距离.强制在线. 题解: 这题我采用的做法是kruskal重构树. 可能大家对kruskal重构树并不是很熟悉,…
显然可以用LCT维护kruskal重构树.或者启发式合并维护kruskal重构树的倍增数组虽然多了个log也不一定比LCT慢吧. 当然这里的kruskal重构树几乎只是把树上的边权换成了点权,并不重要. 我们要查询的是树上两点间路径边权最大值.显然要并查集按秩合并一波.然后……并查集的树高就是log啊?维护个鬼的倍增数组啊直接暴力啊? #include<iostream> #include<cstdio> #include<cmath> #include<cstd…
kruskal重构树是一个比较冷门的数据结构. 其实可以看做一种最小生成树的表现形式. 在普通的kruskal中,如果一条边连接了在2个不同集合中的点的话,我们将合并这2个点所在集合. 而在kruskal重构树中,如果一条边连接了在2个不同集合中的点,我们将新建一个节点出来,并用这个新节点作为一个中转连接这2个集合. 如图就是一棵kruskal重构树,方点表示新建出的节点,圆点是原图中的点,方点点权即边权. 这样建出的树会有一些美妙的性质,例如往上走点权是递增的,原图中的每个点都是叶子节点等.…
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一…