Tourists——圆方树】的更多相关文章

CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解时间 总感觉是将一堆水题拼出来的丑陋产物(划去) 毫无疑问看题直接搞上圆方树. 用可删堆或者multiset维护方点的权值. 查询直接树剖搞. 但这样会发现修改时间复杂度无法保证. 所以改成每个方点只记录子节点的权值. 当lca为方点时答案计算一下它上面的圆点. $ O(nlog^{2}n) $ #…
CF487E Tourists 一般图,带修求所有简单路径代价. 简单路径,不能经过同一个点两次,那么每个V-DCC出去就不能再回来了. 所以可以圆方树,然后方点维护一下V-DCC内的最小值. 那么,从任意一个割点进入这个DCC,必然可以绕一圈再从另一个割点出去. 所以,路径上的最小值,就是圆方树路径上的最小值.方点的最小值就是在这个DCC中走一走得到的. 树链剖分+线段树维护路径 用堆维护方点四周的圆点的最小值.然后更新. 一个问题是: 更新一个割点圆点,会影响到四周所有的方点.暴力更新,菊花…
传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就是一个反例 上面这个图如果缩点双会缩成\(3\)个,但是缩边双会将整个图缩成\(1\)个点. 假如我们询问的是\((1,4)\)之间的简单路径,而图中权值最小的点为\(7\)号点,那么如果缩成了边双联通分量,你的答案会是\(7\)号点的权值,意即认为可以走到\(7\)号点,但实际上如果到\(7\)号…
做这题的时候有点怂..基本已经想到正解了..结果感觉做法有点假,还是看了正解题解.. 首先提到简单路径上经过的点,就想到了一个关于点双的结论:两点间简单路径上所有可能经过的点的并等于路径上所有点所在点双的并,也就是说,在建一棵圆方树,方点表示所在点双里的最小点权,两个圆点之间的路径上所有方点的最小值就是答案. 然后这题有一个修改单点..修改一个圆点的点权的时候和他相邻的方点维护的min都可能变,所以每个方点开一个multiset维护点双最小值就行了. 但是这样复杂度不能保证,因为每次圆点可能会和…
- 学习了一波圆方树 学习了一波点分治 学习了一波可删除堆(巧用 ? STL) 传送门: Icefox_zhx 注意看代码看怎么构建圆方树的. tips:tips:tips:圆方树内存记得开两倍 CODE #include <vector> #include <queue> #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using…
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我们需要知道什么是 点双联通分量 若一个无向图中的去掉任意一个节点都不会改变此图的连通性,即不存在割点,则称作点双连通图.那么一个极大的点双联通子图,就是一个双联通分量了 那么求这个方法,和普通求割点的\(tarjan\)类似 用一个栈维护所有的点 对于搜索到一个割点,然后把他的栈内部的点依次弹栈,直…
[CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我们可以让所有的方点表示它所在的点双的最小权值, 这样子只需要对于圆方树树链剖分之后维护链的最小值就行了. 好的,回归带修改,无非是要动态的维护一下方点的最小权值了. 你问我怎么动态维护若干个值的最小值?搞个\(multiset\)不就好了吗? 但是,现在问题又来了,如果每次修改一个点的权值(这个点当…
终于学了圆方树啦~\(≧▽≦)/~ 感谢y_immortal学长的博客和帮助 把他的博客挂在这里~ 点我传送到巨佬的博客QwQ! 首先我们来介绍一下圆方树能干什么呢qwq 1.将图上问题简化到树上问题 2.一般是路径并 3.资磁修改! 然后我们就可以步入正题来学习圆方树啦~ ——超良心圆方树教程!—— 这里是一个前缀芝士清单! 1.Tarjan求点双连通分量 2.树链剖分 如果你大体知道这两个东西在干什么 那你看接下来的教程就会非常熟练[大雾 一.圆方树的构造 原图中的点称为原点 新建的点称为方…
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个方点,向所有的点双内的点连边 性质 一定是个森林 每个点双有唯一的方点 圆点方点相间分布,相同点不相邻 等等 例子 1 题面 求可以出现在两点之间的简单路路径上的点的最大权值,不带修改 分析 考虑用圆方树来解决 设圆点权值为本身,方点权值为点双中的最大权值 那么就是树上的路径最大权值 例子 2 还是…
洛谷 Codeforces 思路 首先要莫名其妙地想到圆方树. 建起圆方树后,令方点的权值是双联通分量中的最小值,那么\((u,v)\)的答案就是路径\((u,v)\)上的最小值. 然而这题还有修改,可以在每个方点维护一个\(multiset\)以支持. 但如果每次修改都暴力修改相邻的方点权值显然要挂,如何优化? 可以令方点的权值不包括自己的父亲,那么修改圆点时只需要修改自己的父亲即可. 查询时如果\(lca\)是方点那么还要与方点的父亲取\(\min\). 比较码农. 代码 #include<…