= Vain学习(C/C++ acm算法 python Linux Golang)的个人网站 =

Fhq treap

传送门:

学了Fhq Treap之后,我深深的了解到 Fhq Treap的牛逼,因为上一张学了替罪羊平衡树,码量很大,操作繁琐,不支持提取区间信息,虽然简单理解,但是Fhq也很好理解呀,而且码量不大,能快速维护一颗平衡树,支持提取区间信息

Fhq Treap 的骚操作:

  • 分裂
  • 合并

替罪羊树模板

替罪羊树入门:

以洛谷模板题为例:
普通平衡树

这题正解是替罪羊树,呢么什么是替罪羊树?
替罪羊树其实就是一颗平衡树,但是我们要如何去维护树的平衡呢?
俗话说,暴力即优雅,替罪羊树,是通过重新构造不平衡的子树来进行维护树的平衡的
替罪羊树的部分:

  • 插入操作:插入节点((检查树的平衡(不平衡,则重构树(中序遍历,分治重构树,),更新树的节点信息)))
  • 删除操作:删除节点((检查树的平衡(不平衡,则重构树(中序遍历,分治重构树,),更新树的节点信息)))

Leetcode 切分数组

dp + 筛最小素因子 + 枚举最小素因子

切分数组:

给定一个整数数组 nums ,小李想将 nums 切割成若干个非空子数组,使得每个子数组最左边的数和最右边的数的最大公约数大于 1 。为了减少他的工作量,请求出最少可以切成多少个子数组。
示例 1:
输入:nums = [2,3,3,2,3,3]
输出:2
解释:最优切割为 [2,3,3,2] 和 [3,3] 。第一个子数组头尾数字的最大公约数为 2 ,第二个子数组头尾数字的最大公约数为 3 。
示例 2:
输入:nums = [2,3,5,7]
输出:4
解释:只有一种可行的切割:[2], [3], [5], [7]


限制:

  • 1 <= nums.length <= 10^5
  • 2 <= nums[i] <= 10^6

可持久化数组

可持久化数组

可持久化数组其实就是保存了历史版本的数组。
对于历史版本,我们需要开一个rt[ ]来保存,
当前版本的根节点,我们通过根节点的索引,可以,
找到当前版本的树中,所携带rt[0]-rt[i]这个区间,
的任意点的信息。


浅谈主席树

主席树

我学习主席树,其实已经好几个月了,但是一直没有理解透彻,只能看着板子敲,
今天有回顾了一下主席树,然后就突然有了新的理解。

主席树学习的前置技能

  • 权值线段树
  • 动态开点

线段树实现普通平衡树操作

洛谷: 3369 (模板)普通平衡树

题目描述:

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  • 1.插入 xx 数
  • 2.删除 xx 数(若有多个相同的数,因只删除一个)
  • 3.查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 )
  • 4.查询排名为 xx 的数
  • 5.求 xx 的前驱(前驱定义为小于 xx,且最大的数)
  • 6.求 xx 的后继(后继定义为大于 xx,且最小的数)

HDU 3282 动态开点+区间第k小

题意:

给n个数,把这n个数以此插入容器中,当插入的数量是奇数个时输出中位数

ABA的个数

题意:

给一个只包含大写字母的字符串,求其中有多少个ABA(不一定连续)
举个栗子: ABBBA 这个样例有3ABA


O(n)哈希检验求最长回文子串

求最长回文子串,大家公认的算法是Manacher,但是如果我们不想学习Mangacher,又想在 O(n) 的时间复杂度下解决该问题怎么办?


哈希算法可以帮我们做到,而且容易理解,代码还很短

举个栗子
现在有字符串 str="cbaaab",我们要求它的回文子串,那么该怎么办呢?
这里我们借用Manacher算法里的一个思想,向原字符串里插字符,使得这个字符串为奇数个,这样方便我们统一处理。
我们在这个栗子中插入'#'

我的第一篇博客

Hexo 常用命令详解

1:hexo init

hexo init 命令用于初始化本地文件夹为网站的根目录

$ hexo init [folder]

  • folder 可选参数, 可以指定初始化目录的路径, 若无指定则默认当前目录