题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走 现在有Q组询问,每组询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1. 在线做法题解: 一句话题解:kruskal重构树dfs序上建主席树直接查询第k大即可 知识点拓展: 下面讲讲kruskal重构…
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重构树,两个节点的d值就是lca代表的边的边权,问题转化为对于每个lca计算以它为lca的且满足$|c_u-c_v|$的点对的个数 对于每个lca我们枚举 size 较小的那棵子树内的点(每次选择size较小的暴力计算就是启发式合并),算出在另一棵子树中能与它组成点对的点的个数.这个问题实际上就是询问…
P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个困难值,这个值越大表示越难走,现在有\(Q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的山峰中第\(k\)高的山峰,如果无解输出\(-1\). 输入输出格式 输入格式: 第一行三个数\(N\),\(M\),\(Q\). 第二行\(N\)个数,第\(i\)个数…
其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边的点 \(u,v\) 不直接连边,而是新增一个虚拟节点 \(T\),权值为 \(u,v\) 间的边权 \(w\),并连边 \(T\to u,T\to v\). 下图可以较为清楚地展示 Kruskal 重构树的过程,正常的 Kruskal 我们是这样连边的: 而 Kruskal 重构树我们是这样连边的…
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n). 我们依次用 l,a 描述一条边的长度.海拔. 作为季风气候的代表城市,魔力之都时常有雨水相伴,因此道路积水总是不可避免 的.由于整个城市的排水系统连通,因此有积水的边一定是 海拔相对最低的一些边. 我们用水位线来描述降雨的程度,它的意义是:所有海拔不超过水位线的边都是有积水的. Yazid 是一名来自魔力之都的 OIer,刚参加完 IO…
强制在线 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…
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并且他有一部车,车只能在海拔高度大于降水量的道路上行驶,如果某一条边的海拔高度小于等于降水量,那么小\(Y\)就必须下车步行,现在有\(q\)次询问,每次询问从目标点到\(1\)要步行的最短距离.强制在线. 题解: 这题我采用的做法是kruskal重构树. 可能大家对kruskal重构树并不是很熟悉,…
水壶 本来从不写针对某题的题解,但因为自己实在是太蠢了,这道题也神TM的恶心,于是就写篇博客纪念一下 H水壶 时间限制 : 50000 MS 空间限制 : 565536 KB 评测说明 : 2s,512m 问题描述 \(JOI\)君所居住的IOI市以一年四季都十分炎热著称. \(IOI\)市是一个被分成\(H*W\)块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有\(P\)个,编号为\(1...P\). $ JOI$君只能进入建筑物与原野,而且每次只能走到相邻的区域中,且不能移…
题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的. 考虑把Kruskal重构树建出来,重构树上每个新的节点代表的是边权,同时用倍增数组维护出跳2^i步后能走到的值最大的节点 这样,该节点的整个子树内的节点都是可以走到的. 用dfs序+主席树维护出每个节点内H的值,直接查第K大即可 需要注意的是,对于不在原树内的节点,H要设的非常小,或者不插入,以免对答…
读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[x][0/1]数组来履行此职责,表示该节点维护的最左(最右)的叶子节点.每跑到一个叶子节点就把他插入主席树中.然后就是基本操作了,倍增找到我们想要的点,用该点的range来在主席树中查询即可. 按题目的困难值要求,显然重构树是个大根堆,用v数组存困难值. 下面的两个代码,一个是参考代码,注释很详细,…