随笔分类 - 模板
摘要:TarjanTarjan算法 Tarjan求强连通分量 概念: 如果两个顶点互相可达,则它们是 强连通 的。如果一幅有向图中任意两个顶点都是强连通的,则这幅有向图也是强连通的。 强连通分量就是图中具有连通性的一个最大子集,一般可以用来缩点,即相互到达的一堆点可以将他们有用的信息统一到一个点上去。求解强连
阅读全文
摘要:"题目" 悬线法的思想——即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界。 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值。 考虑如何线性求出两个障碍的矩阵上下边界, 我们可以把障碍按x坐标排序,然后对于每个障碍,都找x比他大的障
阅读全文
摘要:n SAT 是给定多个条件,问是否有一个赋值方式使所有条件得到满足。 每个条件都有n个变量, 而2 SAT 是存在时间复杂度为O(nm)或O(n+m)的做法(m是条件数)的算法的问题。 2 SAT往往是判断是否有方案使条件得到满足的一个算法。 建图: 求解2 SAT问题,需要转移到图上,对于
阅读全文
摘要:分数规划 分数规划可以用来处理有关分数即比值的有关问题。 而分数规划一般不单独设题,而是用来和dp,图论,网络流等算法结合在一起。 而基础的做法一般是通过二分。 二分题目我们都知道,需要求什么的最小或最大值,就二分什么。 而该最小或最大值都会满足单调性。 设当前最大值为maxn,如果存在比值使得
阅读全文
摘要:SPFA和DIJ求最短路的算法的坑点一直是很多的。经常会让人搞不懂。 易错案例: 用重载运算符来排序,如: 这种做法是不对的,该dis值在堆里不会更新甚至会堵住。 正确案例: 目前只有两种优化算法最可靠,分别为优先队列来优化spfa或dij。 SPFA: 每次从堆中只需要取出到t的最短路最小的元
阅读全文
摘要:离散化 离散化适用于数据的权值不重要,数据权值之间的相对位置及大小关系重要的一种优化方法。而离散化也有许多方法,其中各有好坏。 1.排序解法(可处理重复元素) bool cmp(ha c, ha b) { return c.num
阅读全文
摘要:可持久化数组 可持久化数组相比与一般的数组来说多了一个限制条件:可持久化。 原题中的数组则可以用线段树来优化。 而可持久化的暴力解法就是对于每个操作都开一个线段树,可是这样的耗费空间都太多了,因此我们选择动态开点。 动态开点: 定义结构体的时候就不能像普通线段树一样来定义了,应该定义为 我们可以在原
阅读全文
摘要:逆序对 逆序对非常常见,有三种求解的方法,效率差不多,但是树状数组法较快。 归并排序 归并排序的思想就是递归分治,把要解决的区间分成两个区间比较ai和aj的大小(其中ai属于左区间,aj属于右区间,其实就是将左右区间合并、并排序),若$a_i include include
阅读全文
摘要:马拉车 Manacher算法是用来O(n)求解最长回文串长度或输出最长长度的一个由manacher发明的一个快速高效的算法。 BruteForce 改题目的暴力算法还是比较好想的,求出该串的所有子串,然后将每个串O(n2)的算法来判断是否回文,这样就可以求出最大回文
阅读全文
摘要:模拟退火(SA)和随机化贪心 物理上的模拟退火 固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。 启发 根据物理上的模拟退火,我们可以吸取一些经验,采用模拟退火
阅读全文
摘要:次短路 次短路,顾名思义即是除了最短路以外最短的路径,如果把最短路比作皇帝,那么次短路就是宰相的关系。 在信息学竞赛中,常常会用两种方法来求次短路。 1.最短路算法 这种和求最短路的方法相同,仅仅只是更改松弛时的操作,就相当于是求一个区间内的最大值和次大值一样,用两个数分别保存最大值和次大值,因此可
阅读全文
摘要:LCA LCA即最近公共祖先,在我们进行树上的某些毒瘤操作的时候,常常需要知道它的值,因此就出现了许多用来求LCA的代码。 倍增 而倍增则是其中最好写,最好理解,支持的操作比较多(比树链剖分要少)的一个算法了,所以本文只介绍该算法~~才不是因为我不会~~。 思想 思想顾名思义就是倍增了,
阅读全文
摘要:分块 思想 分块作为一种在oi中十分(暴)妙(力)的算法和思想,常常被使用于各种数据结构和暴力算法中,所以它又被叫做优雅的暴力.世界上最好的算法就是暴力,因为它能处理最多的问题,但是更好的算法就是分块.分块主要基于分治,便是把各种数据分别装到不同的块中,然后在处理的时候分类讨论该怎么处理的算法.
阅读全文
摘要:单调队列,顾名思义就是一个具有单调性的一个队列,可是该怎么实现呢。 用普通的队列肯定不能实现,因此我们需要用到里一个数据结构——双端队列,这个也比较容易理解,就是两头都可以进和出队的操作。 然后我们就可以进行愉快的写单调队列了。 单调队列与优先队列还不一样,优先队列只要你不主要删除,他是不会删的,但
阅读全文
摘要:说起树状数组,那就不得不提到线段树,它们可以说都可以完成区间修改和区间查询,但是树状数组的常数小,还好写,但是缺点是不能实现其他的高端操作,因此我们应该把这两种方法都掌握。对于那些简单的操作,可以用树状数组来写,反之就得用线段树了。 树状数组的主要思想跟线段树差不多,都是采用分治,但是他们的代码实现
阅读全文
摘要:线段树 1:概念:一看名字就知道是一棵树,但是这个树为什么有线段这两个字呢,原因就是他的思想——分治。 且它的结构大体上相似于一个2叉树。且每个子节点都相当于一个子区间,且父节点是子节点信息的总和,所以才叫线段树,如图这就是一个线段树。 emmmm,图是从一个大佬从网上偷的那个图偷的。 2:功能及特
阅读全文
摘要:堆是一个神奇的数据结构,可以手写堆,但是我不会,我们机房就有一个大佬(cym)就特别痴迷手写堆。 我作为蒟蒻,当然比不过cym他几乎能跟堆扯上边的他都会。 所以我只能介绍一下STL里的结构额,优先队列——pri...算了,不会拼——priority_queue<int> cym;这就是一个优先队列,
阅读全文
摘要:并查集是一个非常非常简单,好背,但不好理解的结构,但只要理解了,闭着眼都能打出来,当然我也因为这个困扰了好长时间,接下来我给大家说说并查集支持的许多操作。 1:找祖宗(find) 就是找一个团伙的头目。 这里直接给大家讲一个神奇的东西路径优化,要记住,路径压缩只是是将该点与他祖宗哪条路径上的点连接起
阅读全文
摘要:RMQ即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。 ST表既ST算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。 以求最小
阅读全文