自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ayanami_Rei的博客

记录算法学习历程

  • 博客(199)
  • 收藏
  • 关注

原创 树上分治算法-点分治/动态点分治

尝试用容斥原理计算, 首先将当前重心的所有子树的点放入一个集合, 任取两个点计算距离, 如果。每次选取重心的过程是将子树划分成不相交的连通块, 每一个连通块大小。树的重心: 将该点删除后, 剩余每个连通块的点的数量。但是这样会产生不合法的情况, 可以分别处理每个子树的。因为每次最多删除一次树的重心, 一共最多。个点, 并且要排序, 总的算法时间复杂度。所在子树所有点的信息排序, 然后二分求。给整棵树的问题之后, 将问题分为两类。, 按照年龄排序, 相当于求。个子树, 因此可以直接。的方案数量, 可以用。

2025-12-26 14:30:30 529

原创 后缀自动机的概念与应用

会变成当前串, 那么子串出现次数应该累计(上图深红色的节点), 并且根据上面的性质, 这些点都是。对于一个节点存储的最长子串, 当子串长度变小的过程中(因为存储的子串都是连续的),分别表示当前集合的最长后缀的长度和最短后缀的长度, 形式化的表示。, 因此只会连接一条边, 因此所有的虚线边构成的图就是树。的子串都是一一对应的, 如果暴力的存储空间复杂度是。, 后面没有字符了, 假设在后缀自动机中的点是。因为每个状态的最短子串是固定的, 并且最短串。, 因为是公共的, 因此多个子串之间取最小值。

2025-12-23 14:51:45 489

原创 详解后缀数组(SA)数组

倍增法O(nlog⁡n)O(n \log n)O(nlogn)对于一个字符串有很多后缀, 第iii个后缀假设当前字符串aababbaababbaababb, 后缀如下第一次只关注每个后缀的第一个字符按照字典序排序, 如果没字符用nullnullnull表示, 比任意字符都小第一次排序的结果, 第一个字符相同相对顺序不变可以用基数排序算法时间复杂度O(n)O(n)O(n)假设执行某一轮后已经按照前kkk个字符排好序了, 考虑前2k2k2k个字符将每个后缀的前kkk个字符当作第一关键字, 将后kkk个字符当作第

2025-12-20 13:53:13 844

原创 P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

假设已经知道了区间内众数出现的次数。查询区间众数出现的次数, 尝试对。对于每个数字记录出现的位置。假设区间内众数出现的次数是。

2025-12-18 14:41:37 522

原创 详解左偏树(可并堆)的代码和示例题目

因为分为了。

2025-12-18 12:00:21 773

原创 分块之基本思想

对块初始化, 定义块的起始位置和结束位置, 初始位置下标是。累计到桶中, 然后判断散列块的每个位置(假设是。对序列分块, 修改的时候首先修改块的。, 然后修改整块, 注意修改后需要对。出现的次数, 初始的众数是块内的众数。具体的来说, 假设区间左端点块号是。预处理这样数组, 算法时间复杂度。结束位置的众数, 算法时间复杂度。就知道了, 查询的时候需要查询。的影响, 整块的影响直接计算。首先确定块的大小, 然后对。进行排序处理, 查询的时候。的众数是否会对结果造成影响。查询整块的两侧, 然后再。

2025-12-16 12:53:05 1004

原创 详解莫队算法和代码实现

出现的位置和。

2025-12-14 12:50:34 916

原创 区间不同数的个数-树状数组/线段树/莫队/主席树

移动到下一次查询的左端点, 对于当前。假设最坏情况下, 每次查询一个区间。假设对于当前数字上一次出现的位置是。指针只会走一次, 算法时间复杂度。, 不对答案产生影响, 否则答案。左右时间取最大值, 因此优化后的。因为每次移动指针最坏情况下是。因此左指针的最差时间复杂度是。因为树状数组维护的是位置的。蓝色部分是下一段查询的区间。指针, 移动到下一次查询的。, 左指针的最大移动次数是。次, 算法时间复杂度最坏。的数字的个数, 可以使用。上, 同时对于当前数字。块, 每一块长度是也是。, 右指针的移动次数是。

2025-12-13 16:42:55 890

原创 进阶数据结构Splay应用-维护数列

因为执行。

2025-12-11 15:19:54 950

原创 详解Splay平衡树

也就是该树的中序遍历是有序的, 可以实现查询第。:不管对Splay进行什么操作, 将当前操作的点。, 需要取值, 并且计算最终薪资的时候需要加。暴力做法是并查集 + 排序, 算法时间复杂度。能处理的问题(因为可以加入延迟标记)这样操作已经证明了, 均摊时间复杂度。Splay的特殊操作, 可以支持。类似于线段树, 树形结构需要通过。, 旋转之后也是这样的大小关系。如果没了解过线段树,大数, 查询一个数字的。节点, 将节点转到树根。, 可以记录一个偏移量。可以使用splay实现。的代表元素, 假设是。

2025-12-10 23:18:27 864

原创 基于值域的离线分治算法-整体二分

单点修改, 只需要在操作结构体中记录, 假设当前位置是。也同步修改, 以为多了操作, 操作数量最坏情况下是。放回到操作序列中, 方便下一层递归层级计算。, 新的数值产生新的贡献即可, 具体的来说。无论当前是添加操作还是修改操作都存储在。(4) 将划分好的左右缓冲区的。注意在操作序列修改后, 需要再。, 需要构建线段树, 同时为了。需要将树状数组或者线段树清空。, 那么只需要将原来的贡献。(1) 如果当前操作是。整体二分 + 树状数组。, 那当前位置是贡献是。整体二分 + 树状数组。整体二分 + 线段树。

2025-12-08 15:49:46 816

原创 进阶数据结构应用-单词

和哪些前缀匹配, 在AC自动机直接可以。我们可以统计这样一个数值, 对于串。递推思想, 对于当前后缀。因此直接按照AC自动机的。都是和当前后缀匹配的。, 那么答案需要累计。, 将前面的前缀全部。

2025-12-07 18:19:06 851

原创 进阶数据结构-AC自动机

有致病片段, 因为是匹配的, 当前后缀也包含那个前缀, 因此当前后缀也有致病片段, 因此可以做。AC自动机本质是在Trie树上用KMP算法的思想的结果。, 因此在统计单次数量的时候, 需要将指针。能到达的字符串都遍历一遍, 具体的来说。是根节点, 因此插入的时候是从节点。开始的, 因此AC自动机向前寻找。类比于KMP算法, AC自动机的。指针的过程进行优化, 具体的来说。因为对于Trie树来说, 节点。, 因此在查询过程中, 可以。, 非常高的效率检查主串。在上述Trie树中,问题就变成了如何计算。

2025-12-06 16:35:22 952

原创 详解KMP算法的原理和代码实现

连接, 拆分之后特殊字符消失,因为拆分之前两个字符串直接使用。, 如果不相等继续找第三长的。那么问题就变成了, 如何根据。的思想, 假设已经计算出了。, 对新的字符串求一遍。对于当前情况, 如果。, 可以进行拼接操作。

2025-12-06 11:55:04 818

原创 进阶数据结构应用-SPOJ 3267 D-query

有了这个性质, 在查询的时候需要统计。, 可以这样考虑, 对于当前数字。, 如果这个数字在区间。的数字个数, 可以使用。解决, 只需要将线段树。, 在线段树节点中统计。

2025-12-05 20:08:42 697

原创 可持久化数据结构-持久化Trie和持久化线段树

节点, 但是并不是插入的是相同的字符串, 需要分裂, 同时发现也需要用到。假设修改的是红色区域圈住的点, 线段树最多修改。个版本, 算法时间复杂度和空间复杂度都是。是根节点, 上图是插入两个字符串的情况。, 因为每次最多改变的节点数量是。(1)先考虑简单情况, 假设。个点, 右边是复制过来新的点。如果暴力的做法, 假设一共。, 求异或的最大值可以使用。节点, 这样当前位结果就是。的限制, 因此问题就变成了。个版本, 计算最大值即可。, 这样问题就得到了解决。个节点, 算法时间复杂度。

2025-12-05 13:42:02 589

原创 序列逆序对的计算方式

在归并排序向上合并的过程中, 对于两段有序的序列合并为一个序列, 如果是顺序的。, 具体的来说, 如果前面出现了。如果一段序列是有序的, 那么对于。, 不能用右半边统计, 也就是。构成了逆序对, 答案需要累加。, 可以统计前面有多少个数字。为什么统计左侧就是正确的?, 但是当出现了当前情况。注意: 树状数组的下标从。开始, 离散化的时候需要。构成逆序对, 然后再将。的时刻, 立刻统计出。, 因此对于当前位置。可以使用树状数组实现。

2025-12-04 12:19:15 729

原创 进阶数据结构应用-维护序列

但是延迟标记是有更新顺序的, 可以做如下套路, 假设当前考虑的区间是。(2)再讨论, 父节点的乘法延迟标记下传, 假设是。(1)此时, 父节点加法延迟标记下传, 假设是。先做加法再做加法, 假设区间中某个数字是。此时, 父节点加法延迟标记下传, 假设是。因此对于延迟标记的更新, 我们认为的规定。具体的来说假设当前节点的加法延迟标记是。, 父节点向下传递的加法标记是。, 很难在原数字基础上加。, 得到下面的式子(除非。那么新的加法延迟标记是。, 新的乘法延迟标记是。线段树需要记录的属性。

2025-12-03 16:09:43 726

原创 进阶数据结构-线段树

在修改的时候, 也需要将当前延迟标记向下传, 例如假设当前区间的延迟标记是。之间的区间, 线段树的单独的子节点(类似于上图红色框住的点)的数量一定是。假设修改的是这样一颗线段树, 修改一段区间最坏情况下节点个数是。当前节点的标记未向下传播, 只给根节点打上了标记, 直接返回。假设计算红色区间内的区间和, 对于当前节点。, 具体的来说, 线段树一般有如下操作。因为前面的都是满二叉树, 节点总数等于。分配空间的时候, 一般倾向于。具体的来说, 伪代码如下。, 因此总的节点数量。, 在计算的时候需要。

2025-12-03 14:04:28 935

原创 进阶数据结构应用-线段树扫描线

具体的来说, 假设线段树修改到了上面红色的节点(子节点), 但是每次查询只查询根节点(蓝色), 只会用到根节点的。在修改完子节点回溯的过程中向上更新(添加减少的都是相同的子节点的值), 也就是。个矩形覆盖, 需要累加到答案当中。不连续, 将面积从左到右做细分。类似于扫描的思想, 只要是。上建立线段树, 检查当前。抽象为线段树的两个操作。等价与当前这段区间被。线段树维护的节点信息。

2025-12-03 13:47:14 662

原创 进阶数据结构应用-一个简单的整数问题2(线段树解法)

定义线段树需要维护的信息。

2025-12-02 15:42:00 197

原创 进阶数据结构应用-区间最大公约数

因此可以将对区间的查询和修改转化为如下形式。因为左边能推出右边, 并且右边能推出左边,对于修改情况, 假设当前区间的最大公约数是。, 因为是差分数组, 查询的时候需要计算。, 修改也是区间修改, 但是因为转化为了。因为涉及到区间修改和区间查询, 使用。, 单点修改值(因为改的是差分数组), 那么当前区间的最大公约数等于。因此如果是直接修改一个位置,, 因此可以直接推广到上面情况。, 并且因为最大公约数具有。, 只存储一个最大公约数。, 发现因为一个数的。, 是可以直接操作的。, 对于当前区间情况。

2025-12-02 12:20:41 848

原创 基础数据结构应用-最大数

因此。

2025-12-01 16:38:16 422

原创 进阶数据结构应用-你能回答这些问题吗

那么问题变成了, 计算当前位置的。信息, 那么问题又变成了,因为结果的最大子段和是可能。, 答案是显然可以的。

2025-12-01 16:33:51 381

原创 基础数据结构应用-谜一样的牛

推断出当前牛的身高, 假设当前牛的身高是。上述的操作其实是平衡树的操作,, 那么当前牛的身高是在。, 初始化每个位置都是。

2025-12-01 12:16:05 855

原创 进阶数据结构应用-一个简单的整数问题2(Fenwick-Tree 解法)

尝试将上述公式展开为表格, 发现可以将表格补齐, 补齐后的结果。区间查询操作, 可以转化为求。可以使用个树状数组一个维护。问题, 因为只要知道了。, 进行区间修改操作。, 计算前缀和需要开。

2025-11-30 20:34:36 1044

原创 基础数据结构应用-一个简单的整数问题

只能支持单点修改, 单点查询。如果对原序列的一个区间。区间修改, 单点查询。因此可以求出原序列的。, 那么就是差分序列。

2025-11-30 19:33:55 772

原创 基础数据结构应用-楼兰图腾

按照最下面的点进行分类, 假设最下面的点分为。按照集合思想考虑, 将所有的。, 假设当前点的纵坐标是。

2025-11-30 16:28:48 543

原创 进阶数据结构-FenwickTree

树状数组的推导和代码实现

2025-11-30 14:06:40 848

原创 进阶数学算法-取石子游戏(ZJOI2009)

ZJOI 2009 取石子游戏

2025-11-29 17:10:21 838

原创 进阶数学算法-取石子(ICPC 亚洲区域赛(成都) 2011)

首先考虑简单情况, 我们假设所有堆石子数量都。是奇数情况, 假设合并某两堆, 堆数量减少。是偶数情况, 假设合并某两堆, 堆数量减少。实现上述状态转移, 算法时间复杂度。变为奇数, 假设拿走一个石子,变为奇数, 假设拿走一个石子,首先是奇数状态的情况, 因为。先手必败, 以下是证明过程。再证明偶数状态的情况,因此, 简单情况下,如果是奇数, 先手必胜。表示: 堆的石子个数为。, 我们将该情况设为。

2025-11-29 13:57:24 825

原创 基础数学算法-移棋子游戏

每个点的后继元素数量其实是边的数量。, 可以先计算后面所有。的, 游戏一定会结束。, 算法时间的复杂度。

2025-11-29 12:05:39 999

原创 求最大公约数-欧几里得算法的证明和实现

求最大公约数有两种算法,和更相减损法, 这里只讨论。根绝上述引理, 证明。

2025-11-28 16:38:54 985

原创 基础数学算法-扑克牌

这样就可以将当前局面的所有牌表示出来, 下一步问题是如何进行。因为该问题的状态数量很多, 建图不方便, 也就是。注意: 如果当前使用的牌的数量超过了总和。状态转移到下一个状态, 翻开小王的情况。是可以作为任意一张牌加入到牌堆当中。要求计算翻的牌的期望数量。因此需要重新设计状态表示。, 也就是对于当前状态。那么未翻开牌的数量是。, 因此上述算法使用。

2025-11-28 15:45:10 674

原创 基础数学算法-绿豆蛙的归宿

算法只需要实现上述的公式, 从后向前递推, 因为是拓扑图的递推关系, 不存在环。因为每个点只会被考虑一次, 算法时间复杂度。跳到下一个位置, 要求计算的是。图的性质是, 从起点开始。, 图中所有点也能到达。排序 + 逆序递推代码。因此可以定义状态表示。

2025-11-28 11:40:56 362

原创 进阶数学算法-破译密码

算法之后, 整体的算法时间复杂度降低到。将序列分为两部分, 第一部分有。因此第二部分不同的取值最多有。, 也就是说右边式子去掉一个。已经证明, 现在问题变成了。等于左边, 也就是原来的数。, 使得下面的式子成立。的数对个数, 可以用。个, 因此第二段最多。

2025-11-27 21:25:23 621

原创 基础数学算法-Devu和鲜花

因为计算每种花取的上界不好计算, 可以采用。很小, 直接可以从定义计算, 并且因为。现在问题就变成了, 如何求出。, 上述方程可以转化为。问题就变成了如何根据。

2025-11-27 16:16:50 653

原创 基础数学算法-开关问题

但是该问题求的是方案数, 最终如果有解, 每一个。开关会对其产生影响, 那么有方程。

2025-11-26 22:11:07 343

原创 基础数学算法-球形空间产生器

两个坐标能得到一个方程, 给定。个坐标, 那么能得到。

2025-11-26 21:10:31 668

原创 基础数学算法-有趣的数列

是质数, 扩展欧几里得算法求逆元的前提条件是。法求组合数, 注意每次计算组合数的时候清空。, 求合法的路径的数量, 就是。, 也就是说选法一定在。算法求解, 还是不行。快速幂求逆元的前提是。阶乘分解代码, 注意。

2025-11-26 16:06:34 394

4Byte Instruction SSIC 8bitCPU

4Byte Instruction SSIC 8bitCPU

2025-10-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除