题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. 题解: 这道题貌似是Kruskal重构树的板子题. 很长时间以前做了加强版,现在才发现还有未加强版. 赶紧把代码粘了过来水了过去. (还记得写这份代码的时候被卡内存,用了po姐的主席树模板才过去的) #include <cst…
[ONTAK2010]Peaks kruskal重构树练手题. LG传送门竟然不强制在线?看到离线水过很不爽:B站强制在线版传送门 看到"询问从点\(v\)开始只经过困难值小于等于\(x\)的路径",马上想到kruskal重构树.先把重构树搞出来,可以先用类似NOI2018归程(题解)的方法处理,然后把叶子节点按dfs序放到序列上,重构树上每个点的子树的叶子节点在序列上是连续的,预处理出每个点的子树在序列上对应的左右端点,问题就变成了静态区间第\(k\)大,直接主席树. #includ…
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. 输入 第一行三个数N,M,Q.第二行N个数,第i个数为h_i接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径.接下来Q行,每行三个数v x k,表示一组询问. 输出 对于每组询问,输出一个整数表示答案…
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT #include<cstdio> #include<cstring> #include<algorithm> #define for1(i,a,n) for(int i=(a);i<=(n);i++) #define for2(i,a,n) for(int i=(a…
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是O(nlog²n), 询问是O(qlogn). ------------------------------------------------------------------- #include<bits/stdc++.h>   #define rep(i, n) for(int i = 0…
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题肯定离线啊,边权从小到大加边不就是煞笔提吗 奇怪的是合并的时候先序遍历才行...中序和后序都T了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> usin…
题意 一块 \(h ∗ w\) 的区域,存在障碍.空地.\(n\) 个建筑,从一个建筑到另一个建筑的花费为:路径上最长的连续空地的长度. \(q\) 次询问:从建筑 \(s_i\) 到 \(t_i\) 的最小花费. \(h, w \le 2 \times 10^3 ,n, q \le 2 \times 10^5\) 题解 对于任意两个建筑把它们之间的只走空地的最短路长度作为权值,然后做最小生成树. 如果搞出了最小生成树,那么就只需在 \(kruskal\) 重构树上求 \(LCA\) 就行了,因…
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的高度值 #include<bits/stdc++.h> #define pa pair<int,int> #define ll long long using namespace std; ,maxm=5e5+; inline ll rd(){ ll x=;; ;c=getchar()…
题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的. 考虑把Kruskal重构树建出来,重构树上每个新的节点代表的是边权,同时用倍增数组维护出跳2^i步后能走到的值最大的节点 这样,该节点的整个子树内的节点都是可以走到的. 用dfs序+主席树维护出每个节点内H的值,直接查第K大即可 需要注意的是,对于不在原树内的节点,H要设的非常小,或者不插入,以免对答…
解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u\)出发,所走边权\(>lim\)的所能到达的点,可以将边从大到小排序,重构树后从\(u\)往上跳到点权\(>lim\)深度最浅的点,这个点子树的叶节点为所求点集合.有了这个以后就可以跑一遍从\(1\)开始的最短路,记\(Min(i)\)表示重构树上\(i\)这个节点所有子树到\(1\)的最小值.…
题目链接 大意 给出有\(N\)个点\(M\)条边的一张图,其中每个点都有一个High值,每条边都有一个Hard值. 再给出\(Q\)个询问:\(v\) \(x\) \(k\) 每次询问查询从点\(v\)出发,只经过Hard值小于等于\(x\)的边能到达的点中,第\(k\)大的High值. 思路 考虑Kruskal重构树: 在Kruskal算法求最小生成树的时候,每次加边将该边化成一个点,该点的点权值是原边权值. 然后用该点与两个连通块连边. 如图: 变为: (左侧为点编号,右侧为点权) 这样重…
Description ​ 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值,这个值越大表示越难走,现在有\(~q~\)组询问,每组询问询问从点\(~v~\)开始只经过困难值小于等于\(~x~\)的路径所能到达的山峰中第\(~k~\)高的山峰,如果无解输出\(-1\).强制在线. Solution ​ 把边从小到大排序插入\(kruskal\)重构树中,对于每次询问, 倍增…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.php?id=3551(同题,强制在线,题解) 题解: 最小生成树 Kruskal,线段树(合并),离线 首先把询问和边放在一起,按权值大小从小到大排序.然后对每个点建一棵权值线段树,维护当前联通块里的海拔权值区间内的山的个数然后按照 Kruskal 算法合并联通块,并且合并两个联通块对应的线段树(Me…
BZOJ 看别人代码的时候发现哪一步都很眼熟,突然想起来,就在四个月前我好像看过还给别人讲过?mmp=v= 果然不写写就是容易忘.写了好歹忘了的时候还能复习呢(虽然和看别人的好像也没多少差别?). 首先非加油站的点是没有用的.考虑如何删掉这些点然后在加油站之间连对应的边. 搬这里的一张图: 因为\(b<a\ \&\&\ b<c\),所以有\(b+c<a+c\ \&\&\ b+a<a+c\),也就是到一个点时,先去一次离它最近的点加油再去其它的点一定不…
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solution\) x的限制将图分成了若干连通块,如果x单调递增的话,只需要合并连通块就可以了. 离线,并查集维护所属连通块,线段树合并状态.查询K大.(强制在线的话可以主席树?BZOJ3551 不想写了还是写了,还好) 强制在线的Kruskal+主席树做法:BZOJ3551. //39360kb 5248ms…
Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. Input 第一行三个数N,…
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有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问. Output…
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现一定选最小生成树上的边,然后用到了一个神奇的东西 Kruskal重构树 进行Kruskal过程中,每条边用一个点代替,左右儿子分别是连的两个点的当前的父亲 这样就形成了一棵树,叶子都是原图上的点,其他都是原图上的边 深度越小的点对应的边权值越大 两点路径上的权值不变 这样的话,与一个点通过权值\(\…
这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组. |||.我们跑出来dfs序就能在他的上面进行主席树了. IV.别忘了离散. V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是...... #include <cstdio> #include…
建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问题,直接对 $dfs$ 序建主席树即可. #include <cstdio> #include <algorithm> #define N 200005 #define M 500002 #define inf 1000000000 #define setIO(s) freopen(s…
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][Status][Discuss] Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor last…
重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor lastans,x=x xor lastans,k=k xor lastans.如果lastans=-1则不变. Output 同3545…
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高的山峰,如…
[BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ 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有一条困…
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor lastans,x=x xor lastans,k=k xor lastans.如果lastans=-1则不变.   Output 同3545 [思路] Kruskal+主席树+dfs序 一个叫kruskal重构树的方法QWQ.在kruska…
强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #define N 100005 #define M 500005 using namespace std; int l[2*N],r[2*N],cnt,num_c…
BZOJ 思路 我觉得这题可持久化线段树合并也可以做 我觉得这题建出最小生成树之后动态点分治+线段树也可以做 还是学习一下Kruskal重构树吧-- Kruskal重构树,就是在做最小生成树的时候,如果一条边\(e\)被选中了,就让那两个连通块的根都连向它,变成新的根.显然,最后会做出一个二叉树,其中叶子是点.非叶子节点是边,且边权形成了一个堆的形式. 分析一下性质,发现"用不超过某个权值的边构成的连通块"其实就是从一个点往上跳,最后的某一棵子树. 于是倍增+主席树区间k大,这题就做完…
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000). 现在有 K个询问 (1 < = K < = 15,000). 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? Input 第一行: N, M, K. 第2..…
题目链接 \(Description\) 有一个\(n\times n\)的正方形网格,上面有若干障碍点.\(q\)次询问,每次询问把一个正方形箱子从\((x1,y1)\)推到\((x2,y2)\) ,不能接触障碍点且不超出边界,箱子的边长最大能是多少. \(n\leq1000,q\leq3\times10^5\). \(Solution\) 我们可以直接将非障碍点看做顶点,向周围四个非障碍点连边.这样是要求一棵最大生成树. 从每个障碍点做八连通BFS,可以得到通过每个非障碍点位置的最大直径.…
3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Discuss] Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000). 现在有 K个询问…