Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

斜堆 斜堆是个很有趣的东西。而且它有一些很有意思的性质。 斜堆的大概就是每次往堆里面插入一个元素的操作非常“有趣”。插入的节点从根节点开始。如果插入的元素值比所在根小,它会将根“挤下去”,即替代原先的根的位置,将原先的根连到它的左子树上。如果所在根节点为空,它直接插入到此节点上。如果插入的元素比根大,那么它就会先交换所在根的两个子树,然后再递归到原先根的左子树进行插入,直到它比所在根小或...

这是之前博客园的草稿,写得不好,本来想直接删除了事。然而,斜率优化是一个很重要也很基础的优化问题,是需要学习掌握的。但我现在没有精力写一篇新的文章了。 OI wiki: 斜率优化

最大权闭合子图 闭合子图 定义有向图的一个闭合子图是该有向图的一个点集,其中这个点集中的所有点的出边连向的还是点集中的点。 最大权闭合子图 给有向图的点加一个点权,能得到的点权最大的闭合子图。 网络流模型 将所有正点权的点的点权全部加入答案。接下来我们将原来正点权的点变成负点权。现在图上全是负点,我们需要尽量选最少点权使图符合条件。 设超级源点和超级汇点。 将超级源向所有...

算法介绍 最大流问题是指在一个有向图中,从一个源点到一个汇点,最大化流量,使得所有边的容量都大于等于 0。 dinic 算法是一种高效的求解最大流问题的算法,其时间复杂度为 \(O(EV^2)\)。 dinic 算法的基本思想是,通过增广路算法,找到一条从源点到汇点的增广路,然后通过深度优先搜索(DFS)算法,在增广路上进行流的增广,直到不能再增广为止。 步骤 初始化 fl...

路径覆盖 路径覆盖指一个路径的集合中所有路径点集的并集为原图点集。最小路径覆盖使路径集合大小最小。 路径覆盖分为可否重复选点两种。可重复选点在建模中加大流量即可。 网络流模型 建超级源 \(S\) 和超级汇 \(T\),将每个点拆点。 将 \(S\) 向所有点 \(i\) 连边,将所有点 \(i'\) 向 \(T\) 连边。 对于原图边集,每一条边 \(u\) 向 ...

【模板】权值线段树套序列线段树 P3380 【模板】二逼平衡树(树套树) 主要思路如下: 外层为权值线段树,内层为动态开点线段树,也就是每个权值线段树上的节点开一个动态开点线段树。 外层的权值线段树支持查询排名,内层的线段树限制了区间。实际上就是在普通权值线段树上查询的价值变成了在其线段树上区间查询返回的值。 对于这道模板题,我们先写几个函数: 插入 下方的update为外层...

差分 记录相邻节点值的差值。这样一来,前缀和就相当于原值了。 树上差分 树上差分基本上就是差分在树上的实现。因为差分的原理,我们先将所有点的权值改变成差分值,再更改一段区间内的所有值时,只需要更改首尾两端的值,如果要求值的话 dfs 重新加上前缀和就是正常的值了。 P3128 [USACO15DEC] Max Flow P 模板题,发现更改任意两点间的值只需要在两点差分值加...

P3384 【模板】重链剖分/树链剖分 适用问题 对一个给定的树,维护(修改、查询)其节点点权/边权,操作可 \(O(\log n)\) 次处理(如路径、子树)。 实现 将一棵树剖分成若干条链,每一条链通过区间数据结构维护。 将一个点的子树中最大的那个做为重儿子,其他的叫做轻儿子,对于所有点的重儿子连的链称为重链。我们将重链作为主链,将轻儿子构成的其他轻链加在重链的后面。很明显,...

点分治 点分治是一种树形分治的算法,它选择当前连通块一个重心,将树分成多个连通块进行处理,然后对每个连通块进行分治递归。 树的重心 树上的一个点,满足它的儿子的 \(size\) 的最大值最小。 可以证明,一个树有一个或者两个重心。若有两个重心,它俩一定是直接相连的。 处理问题 求树上给定路径联通的点的对数。我们发现将树分治后,形成了若干个连通块,而且这些连通块必定经过重心。...

算法介绍 模拟退火是一种最优化随机化算法。什么叫随机化算法?就是抽奖抽正解 一般用于求解最优解,即最优化问题,而且一般比较适合于小数据的最优解和大数据的近似最优解。 算法步骤 每次迭代都随机选择一个解,然后模拟退火得到该解的邻域最优解,如果邻域最优解比当前解更优,则接受该邻域最优解小,则更新当前解为该解。 模拟退火步骤如下: 先初始化温度,当前解和当前答案 如果温度小于最终...