
算法竞赛
文章平均质量分 79
taulee01
Coding 从 Ctrl CV 开始.
展开
-
二分三分算法详解, 模板与临界条件分析
还有一种更为通用的写法, 因为这种循环不超过几百次. 完全可以写一个循环, 直接跑上一千次. 完全在大多数的题目时间限制里.当然, 既然在实数域上了, 当然也是可以直接暴力循环一千次的. 代码就不贴了, 一定不是我懒着写.实数域上的二分, 相对就比较简单, 如果选取上面的模板, 只需要改退出条件为。, 代表初始的这个数组范围, 在二分的过程中会不断缩小. 宗旨就是: 让。学习是开放的, 推荐一个我常常跟随学习的大佬的。的数中, 最左边的一个, 即找到例子中的。的数中, 最左边的一个, 即找到例子中的。原创 2025-04-13 21:20:15 · 704 阅读 · 1 评论 -
线段树优化建图 + 迪杰斯特拉找单源最短路
先看 1, 我们可以用一个点连到线段树的节点 node {l, r} 来表示这个点到 {l, r} 各有一条单向边(橙色). 此时显然: 大区间向被包含的小区间可以有权值为 0 的单向边(绿色). 因为一个点可以到上面的大区间, 一定可以到达被包含的小区间的任意一个点.如果要实现类似线段树的 lazy 优化也是可以的. 即到达了这个线段树节点, 就是可以到这个节点所代表的区间内的所有点.显然, 这两个树是不共存的, 不能公用一个树. 就要用一定形式把这两个树连到一起. 于是…个边, 显然无法接受.原创 2024-09-10 20:27:07 · 883 阅读 · 1 评论 -
树上启发式合并(dsu on tree)
不妨这样做: 每往上传递子树的贡献时, 其他 ( 轻子树 )的仍旧暴力枚举所有点来计算贡献. 最大的那个子树 ( 重子树) 留到最后一个跑 dfs, 此时跑出来的结果不再动他, 直接往上回溯, 就传承给了上一级. 形象地说, 就是所有轻子树合并到了重子树上, 作为 fa 的子树的贡献.就是说: 遍历所有子树的贡献时, 由于换一根子树 dfs 之前就要清除之前子树的贡献, 我们可以选择一个子树作为最后跑 dfs 的, 这样他就是不用清除的, 就可以节省复杂度.可以证明这样的复杂度是。原创 2024-08-03 16:04:30 · 459 阅读 · 0 评论 -
Tarjan( 系列4)求点双 / 边双连通分量
由此可见: 点双连通两点一定在一个环上, 而边双连通的两点可能是在一个扭起来的环上(如图, 点多次使用, 但边只用一次的环, 可以拆解为多个环) (见题。故: 一个点是割点时, 它一定是点双分量的根. 如果再往上包含它的父亲, 那它就成为分量内的割点了. 操作类似求有向图的强连通分量, 用一个栈去存点.也就是说, 边双可能含有割点. 不同点双可能公用某点 (割点), 边双无公用.桥 (-> 删除一条边使两点不连通 ), 故桥两边的点一定不满住边双。这时的所有连通分量都是边双连通分量.原创 2024-08-02 19:17:54 · 1038 阅读 · 0 评论 -
【主席树】学习笔记
得到的就是 l 到 r 区间所有元素的组成的权值线段树, 然后操作就和权值线段树找第 k 小一样了. 可持续化线段树的就用来保存树的不同版本 Version. 本质就是前缀和操作, 每个。个节点, 并连上未被更改的节点, 且保存这个新根, 注意到, 访问不同的根就相当于访问了不同版本的树.都是一棵树. 其实如果时间空间允许, 完全可以每插入一个点, 就把原树复制一份, 执行前缀和的。个元素被改变, 而且根是一定会改变的, 我们就可以对每次更改, 执行如上图的更改, 新建。访问左右儿子了, 要动态开点.原创 2024-07-24 17:31:45 · 423 阅读 · 0 评论 -
Tarjan( 系列3) 有向图中的缩点操作
Tarjan 是大佬的名字, 大佬一生发明了许多算法, 都叫 Tarjan, 我会渐渐整理出来, 想知道都有啥的话, 可以直接到我文章列表搜索 Tarjan.在 Tarjan 求得 scc 后, 对于每个点打上同样的 scc, 就可以很容易统计出每个 scc 的出度入度有哪些, 就完成了缩点.重温Tarjan, 网上看了许多博客感觉都讲的不清楚. 故传上来自己的笔记, 希望帮到大家.将有向图中的强连通分量缩成一个点, 权值具题而定.原创 2024-07-17 21:35:40 · 291 阅读 · 0 评论 -
Tarjan( 系列2) 在无向图中找割点/桥
如果删除某个点/边后,无向图的连通分量数增多,这个点叫割点/边,桥。即把图分为互不相连的两部分。原创 2024-07-15 14:49:55 · 508 阅读 · 0 评论 -
cdq 分治处理二维三维偏序问题
在函数体内,递归地解决左区间和右区间的子问题,然后对于一个在左区间,一个在右区间的点对,我们分别将左右区间按。,需要捆绑起来一起处理,不然可能会把相等的元素划到左右两个区间去,从而把相等两元素的之间相互的贡献漏掉一半。eg: 当然也可以选择 cdq 套 cdq, 而不是 cdq 套树状数组。具体地,对于右区间的每个点,我们遍历左区间,把第二维符合要求的点的。,然后查询第三维也符合要求的点的数目(即上树状数组求逆序对方法)。但是需要注意,如果偏序关系带等号,对于。为了节约时间,清空树状数组不使用。原创 2024-06-22 16:55:03 · 272 阅读 · 0 评论 -
Tarjan( 系列1) 求强连通子图
提到的一些概念可以参考 oi wiki, 代码也是 oi wiki 的, 因为我不认为我能写出比大佬更好的代码了.重温Tarjan, 网上看了许多博客感觉都讲的不清楚. 故传上来自己的笔记, 希望帮到大家., 说明当前节点是它所属连通块的最小节点. 栈里它之上所有点都是一个强连通块., 说明当前节点是它所属连通块的最小节点. 栈里它之上所有点都是一个强连通块..v 入栈. 回溯时用 low[v] 更新它的 fa 的 low[ ]..v 入栈. 回溯时用 low[v] 更新它的 fa 的 low[ ].原创 2024-06-20 18:46:29 · 1177 阅读 · 0 评论