洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并且他有一部车,车只能在海拔高度大于降水量的道路上行驶,如果某一条边的海拔高度小于等于降水量,那么小\(Y\)就必须下车步行,现在有\(q\)次询问,每次询问从目标点到\(1\)要步行的最短距离.强制在线. 题解: 这题我采用的做法是kruskal重构树. 可能大家对kruskal重构树并不是很熟悉,…
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重构树 我们按边权的海拔从大到小排序,建出Kruskal重构树 这一定是一个小根堆 那么一个点的子树内的节点一定可以相互到达且经过的最小的海拔为该点权值 那么每次查询的时候,我们只需要倍增的处理出从这个点向上走多少才不能满足条件 然后在子树内查每个点到$1$的最大值即可. 哎,调了一上午也没调出来,只…
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海拔.有$Q$组询问,每次查询从$x$出发,经过海拔超过$p$的所有路径,能到达的节点中距离1号节点的最短路径长是多少$QwQ$ 首先看到这个对海拔的限制就显然考虑$kruscal$重构树呗$QwQ$,然后说是所有海拔超过$p$的路径能到达的点中最短路最小的点$QwQ$? 可以理解成把最短路作为一个点…
实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中节点有两个权值L(最短路)和a(海拔),找到我们想要的a,此时的L就是答案. 来看一下总的算法分析吧...... 先按海拔a从高到低排序,然后构建Kruskal重构树,按海拔每次选出剩余边中海拔最高的一条边插入到树中,建成一个小根堆. 接下来考虑询问-- 对于一个水位线p: (1)树中点x的海拔大于p,那么在x的子树…
洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太懂)- 前6个点 这6个点有两种做法: 法1:最短路. 这6个点都是离线的,而且只有一种海拔,所以直接最短路. 跑完之后,直接判断海拔与水位,输出即可. 不过这些分也并不好拿,spfa会被卡,要用堆优化dijkstra. 法2:离线排序+并查集. 其实这个暴力思想就是正解思想了,很好想到的. 首先跑…
传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树可以用来解决一类诸如“查询从某个点出发经过边权不超过val的边所能到达的节点”的问题 首先不难发现,上面这个问题肯定是在最小生成树上走最优,其他边都可以不用去管 那么我们就在建最小生成树的时候搞事情 克鲁斯卡尔重构树的思想就是在建最小生成树的时候不是直接连边,而是新建一个节点,并把这个节点的值设为边权,然…
读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[x][0/1]数组来履行此职责,表示该节点维护的最左(最右)的叶子节点.每跑到一个叶子节点就把他插入主席树中.然后就是基本操作了,倍增找到我们想要的点,用该点的range来在主席树中查询即可. 按题目的困难值要求,显然重构树是个大根堆,用v数组存困难值. 下面的两个代码,一个是参考代码,注释很详细,…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向连通图,边形如 \((u,v,l,a)\).每次询问给出 \(u,p\),回答所有从 \(u\) 出发,只经过 \(a\) 值 \(>p\) 的边能够到达的点中,到 \(1\) 号点的最小距离(以 \(l\) 之和为路径距离).强制在线,多测.   \(n\le2 \times 10^5\),\(m,q\le4 \times 10^5\). \(\mathcal{Soluti…
传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接跑一个dijkstra(关于SPFA,他死了) 然后一遍树形dp就可以了 //minamoto #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include&…
洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权的树 以最小生成树为例,当然最大也一样 先把所有原有的节点点权赋为 \(0\) 在跑 kruskal 的时候,我们没求出一条当前权值最小,且两端点不在同一集合的边时(并查集,kruskal 常规操作),我们就选这条边,然后把两端点划分在同一集合 不过上面仅仅时 kruskal 的操作,另外,我们还要…