- 博客(29)
- 收藏
- 关注
原创 也许是全网最清晰易懂的KMP讲稿?——operator_
我们发现,在暴力匹配时,有很多比较是多余的,比如说,当我们进行了第一次匹配后,第二次匹配其实完全是多余的,因为第二次匹配成功的。其次,跳过去中间不会漏下任何情况,看我们最开始的例子,第二次匹配为什么是不必要的?再比如,当我们进行了第一次匹配后,第四次匹配的前两次比较其实也是多余的,因为我们通过第一次匹配我们得知了。你可能有疑问,我们在跳失配指针时看起来是有一个内循环的,复杂度正确吗?也是顺序的,指的是包含最后一个元素的连续一段,不同,如果这两个串相同,就违反了我们。),好像就可以完成上面的两个优化了。
2023-08-24 14:12:37
120
1
原创 整数分块——operator_
这是一种很简单但好用且优雅的n\sqrt nn分块。考虑求∑i1n⌊ni⌋∑i1n⌊in⌋,很容易发现⌊ni⌋⌊in⌋的值的种类不多,考虑按值域来求解。事实上,⌊ni⌋⌊in⌋的值最多只有2n2\sqrt n2n种(并不严谨,但反正是n\sqrt nn级别的),证明如下:对于ini>\sqrt nin⌊ni⌋≤nin⌊in⌋≤inn。
2023-08-23 15:20:28
151
原创 上下界网络流——operator_
建完模,考虑寻找可行流,由建模的原理,只要源点与汇点所有有关的边全部满流(易证源点满流时汇点也满流),就可以保证原网络流量平衡,即寻得一条可行流,那么只要跑一遍最大流即可。,那么新源点与新汇点的所有边已经满了,同时也已经让新网络的残量网络流量平衡(感性理解,可以视作都减去一个不同的差值使其平衡),所以我们以原网络的源点与汇点跑一遍最大流。的流量大于流出的,就从虚拟源点连一条流量为差值的边,反之就连向汇点。好,现在的问题就转化为了怎么保证差值网络流量平衡,可以发现,在一个正常的网络流中,唯一流量不平衡的是。
2023-08-11 15:19:43
194
原创 treap——operator_
小,那么为了维护堆性质我们要把右儿子变成根节点,但这样会破坏二叉搜索树性质,所以我们要把。性质嘛,就是二叉搜索树的所有性质它都满足,它只不过是让二叉树的形态平衡一点而已。在二叉搜索树插入与删除的过程中,经常会改变树的形态,我们就需要一种操作来维护。以左旋为例,我们在某一操作结束后发现根节点的右儿子。是一种思路简单,码量较小的(弱)平衡树。,具体代码与二叉搜索树差不多,可以去。取随机数,那么它的形态近乎平衡。中,这种操作就是左旋和右旋。的性质 ,易知这是一棵。的右儿子上,如下图。
2023-08-07 15:36:09
148
原创 复数——operator_
咳咳,数学课上学的复数,先写着,之后再补FFTFFTFFT之类的\dots我们用CC表示复数集,任意复数可以表示为abia+biabi的形式,其中a∈Ra∈R为实部,b∈Rb∈R为虚部,iii为虚数单位,满足i2−1i^2=-1i2−1。对于zabiz=a+bizabi,其共轭复数为z‾a−biza−bi。满足xn−10x^n-1=0xn−10的根都被称为单位根。
2023-07-26 13:46:52
99
原创 7.17 模拟赛T1(math)笔记
xy+1|x2+y2。模拟赛的一道T1T1T1,被完虐,记录一下。这思路有点离谱,虽然没用到过任何高级算法、数论知识,但是真的难。其实规律能接受,但证明过程真的复杂。这题据说可以打表找规律,但我没找到,我太蒻了。
2023-07-17 19:52:50
66
原创 并查集——operator_
理解一下题意,发现一个人的所有敌人都是朋友,所以想到给他们也开一个并查集,进而想到先给每个人都分配一个不存在的敌人,设其为。它的思路很简单:把每一组都看作以某点为首的一棵树,记录每个点的父亲节点,那么就可以不断向上找到根节点,也就代表了这个点的组别。顾名思义,就是每个并查集再维护个什么东西,比较常见的有维护到根的距离,合并时注意点顺序就好了。参考平衡树,尽量让集合的深度低一点,所以可以把浅的数放到深的树下,按子树大小同理。虽然也很好用,但要多开几个数组,代码要改的地方比较多,平常用路径压缩就足够了。
2023-06-24 16:31:05
75
原创 堆——operator_
懒得画图,想象一下一个沙漏状的结构,上部是大根堆,下部是小根堆,它们有一个共同的堆顶(实际在写代码时只存在于某一个堆中,或者开一个变量存储),这个堆顶就是我们要求的中位数。删掉之后堆顶就空了,所以要让一个元素来顶替它(具体值是多少没关系,一遍调整就好了),那么为了保持完全二叉树的性质,我们肯定要让最后一个元素顶上去。堆顶一定是最小的,所以可以直接输出,然后把它删除。上面讲到,我们是可以把堆看作数组的,那么对于一个数组,我们也可以把它看作堆。当然,现在的“堆”并不满足堆的性质,所以我们要调整,调整是。
2023-06-16 16:04:38
72
原创 斜率优化——operator_
形如dpiMinMaxai∗bjcidjdpiMinMaxai∗bjcidj]),又满足一些条件的方程都可以考虑斜优,先推式子,转化为计算几何,之后可以考虑单调性、二分、三分等方法快速求解。
2023-05-21 12:07:23
57
原创 5.20模拟赛 赛后回顾
组咒文的其中一个,只要有一段选的不一样就认为方案整体不同,求方案数(对。,现在可以选一个值拿出,再重新插入到序列的任意位置,求最大可爱值。然后和数的大小关系是有关的也是显然的,所以先排序(从小到大)。定义一个序列的可爱值(强烈谴责出题人,怎么又是可爱值)为。段的方案数,转移就暴力枚举每个字符串,不会超时的。听了讲解,这种题就是要考虑每一个数的贡献,易得。求一个集合的所有真子集的可爱度之和(对。,最后再把逆元一块乘上,可能会方便点。定义一个集合的可爱度为若干次操作使。还要求逆元,可以选择都先乘一个。
2023-05-21 12:04:00
49
原创 线段树——operator_
线段树是一种支持各种区间操作、区间询问的数据结构,复杂度同树状数组,时空常数略大,但应用范围极广。树状数组基于二进制,线段树则是基于分治。我们怎么分治?1.1.1.分成左右两部分递归2.2.2.考虑合并3.3.3.考虑边界情况那线段树的写法已经呼之欲出了。
2023-05-21 12:02:16
51
原创 字典树——operator_
想象一下字典,你查字典肯定不是从头翻到尾的吧,字典树就借鉴了这个思想。每个节点下连接了几个儿子,而节点本身代表一个字符(根除外),那么从一个节点到根节点的路径,就是代表的一个字符串。它有一些显然的性质,比如同前缀的字符串会处在一个子树内,可以利用这些性质干一些事(比如本题就可以dfsdfsdfs求子树和,做到O1O(1)O1询问)。它可以做到O∣s∣O(|s|)O∣s∣的插入与查找。
2023-05-16 20:57:40
55
原创 5.13模拟赛 赛后回顾
的定义是最后要被消耗掉的炮灰的集合,一个苹果显然只能吃一次,所以若两个集合都有同一个苹果,就是不合法的。不大,所以直接枚举,两个苹果能都存在的判定就是:都要合法,同时最后。,其实就是存在至少一种情况,让这两个苹果都能在最后存在。),那么都要留给后面,现在就没苹果吃了,直接。),那么这个苹果肯定得留,就只能吃另一个。由于贪心,肯定优先选小的,所以要排序。代码由于细节问题没调出来,就不放了。喜欢的、都喜欢的、都不喜欢的。离散化每个点,用线段树维护。,同时打上标记,代表不合法。),那么显然就不用管。
2023-05-14 17:25:54
55
原创 Huffman树——operator_
发现很多简单,但比较偏的算法我都不懂,所以现在开始按随机跳的题来浅浅了解一下这些东西。也可以说是一个数据结构。它可以用一句话来描述:带权路径长度最短的二(多)叉树。一棵树的带权路径长度是每个节点的权值*这个点到根的距离之和。
2023-05-12 19:09:05
56
原创 5.3模拟赛 赛后回顾
当然这样会有反例,比如这个点先蹦出了矩阵,然后又蹦回来了,当然大部分情况可以通过改变顺序变合法,但也有些点没法调整回来,所以最稳妥的方法应该是特判每一个在边界上的点(一蹦可能蹦出矩阵的),因为。个点的树,点有权,现在要选一些点使点权和最大,要求任意两个点的距离要大于。转移会有点烦,具体来说,就是分。,定义一个合法的字符串必须保证先出现至少连续。被触发了,问最后会有多少点被触发。注意到每个会被触发的点一定能写成。当然了,直接选根,也就是。的范围很小,所以不会超时。的矩阵的样子,每个点。
2023-05-03 18:38:16
60
原创 4.29模拟赛 赛后回顾
这里发现有一个结论,最高的山一定不会被合法的弧所跨过,证明显然,所以考虑以最高的山为首破环成链,这样问题就转化为了经典的另一道原题。座山峰包围,形成一个圆圈。每座山的山顶都有一个瞭望塔,瞭望塔有高度的区别。人们发现他看似一个连续的不下降函数,但是函数的任意切线都是水平的。的最大值,以及子树权值和,状态转移时再分别维护最大值和次大值就可以。以你现在的数学水平,还不能很好地理解这个函数,所以你的任务并不难。然后方法就很多了,可以维护一个单调栈再二分,或者维护。的子树外要全选,子树内的话,就是一个简单的树形。
2023-05-03 18:36:46
94
原创 hash——operator_
核心:设计一个算法,使得要哈希的东西在一定程度上一一对应为一个数值,一般是通过取模实现,从而做到O1O(1)O1比较,或者是支持减法,从而做到O1O(1)O1求任意一个东西的哈希值。一般是用于快速比较。哈希的取模,可以使用自然溢出(即超过范围自动取模),或者手动取模。你要知道,因为哈希是基于取模的,所以对着代码还是可以卡的。自然溢出比较方便,而且速度比一般取模略快,但可能被卡,手动取模相对较烦,但不易被卡(因为模数是自定的),不过你也可以自定义一种数据类型来自动取模。
2023-04-25 19:17:02
231
原创 树状数组——operator_
这个东西比较特殊,用图感觉反而会乱(主要是根节点不是111),我就尽量用纯数学的讲吧。定义tiaiai−1⋯ai−lowbiti1tiaiai−1⋯ai−lowbiti1,反正就是前lowbitilowbit(i)lowbiti个数的和。其中lowbitilowbit(i)lowbiti指的是iii在二进制表示下最低位的111所代表的数量级,比如101010。
2023-04-22 19:29:47
61
原创 最大流——operator_
寻找增广路,求该增广路中的残量最小值,增广路中的每条边都要减去这个最小值,最后答案再加上这个值。不断重复,直到没有增广路了。:从源点出发,通过一些有向边容量的约束,最终能到达汇点的最大流量被称作最大流。寻找增广路,求该增广路中的残量最小值,增广路中的每条边都要减去这个最小值,而。求增广路,但考虑的不是每一条增广路的贡献,而是每个点的贡献。:从源点到汇点的一条路径,这条路径的所有边权都大于0。,最后答案再加上这个值。:网络中的一个特殊的点,只出不进,被称作源点。:网络中的一个特殊的点,只进不出,被称作汇点。
2023-04-09 16:58:26
485
原创 数论基础——operator_
有$a%b=a- \lfloor{{a}\over{b}}\rfloor*b $可以推广得到任意方程的通解。对应的,乘法逆元的定义:若。同时逆元也可能不止一个。有整数解的的充要条件是。再来一次裴蜀定理,就有。最后考虑一下边界即可。所以可得到原方程通解。
2023-04-02 09:47:45
761
原创 最小生成树——operator_
222种算法都是贪心的,可以根据是稀疏图还是稠密图选择合适的算法,在我做的题中好像kruskalkruskalkruskal应用广泛一点。
2023-03-27 20:08:52
57
原创 最短路——operator_
多源最短路无脑floydfloydfloyd,随机数据、有负权边或者需要多次最短路可以考虑SPFASPFASPFA,另外情况用dijkstradijkstradijkstra比赛时SPFASPFASPFA请酌情使用。
2023-03-27 18:51:37
50
原创 高斯消元法——operator_
呃,二元一次方程组解过吧,学校教的是加减消元法和代入消元法,代入消元法是要对原方程移项的,有点麻烦,而加减消元法虽然有很多巧妙的解法,但电脑不知道,所以用最一般的方法:加减消元法正推,代入消元法逆向回带。之所以要回带,是因为高斯消元后的方程组呈三角形,而利用高斯-约旦消元法,我们可以直接得到。高斯消元法的精度误差很大,所以尝试降低误差。你可以尝试一下,会发现除法的误差最大,同时除数越大误差越小。个版本还有一个优化版本,这就是高斯-约旦消元法,它有两个优化。处不再是找到一个就停止,而是找系数最大的方程。
2023-03-26 14:05:42
183
1
原创 2-sat——operator_
2−sat2-sat2−sat问题指的就是有若干个集合,每个集合内部有222个点,这两个点只能且必须取一个(其实就是一个boolboolbool变量的222种取值),在集合外,还有若干个关系,形如::: x1x_1x1 与 y2y_2y2 中至少取一个,求是否有满足所有关系的可行解(可能还会要求构造)。形式化一点,就是求构造boolboolbool数列{x}\{x\}{x}使得(x1∨x2)∧(x1∨¬x4)∧(¬x3∨x4)∧(x2∨x5)∧⋯==true(x_1 \vee x_2)\land(x_
2023-03-26 13:28:36
63
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人