随笔分类 - 算法
异或线性基
摘要:我们考虑这样一个问题:给定 个整数 。求能异或出多少种不同的值。 我们考虑用一个集合 记录目前能凑出来的数字。 当我们要加入 时,如果 ,则 \(x\oplus A_i(x\in S)
李超线段树
摘要:有 次操作,每次操作如下: 插入一条直线 。 求在 处最大的 。 这就是李超线段树解决的问题。 李超线段树就是对 建树,每个点记录其区间中可能为最大值的直线。 这是什么意思呢?我们直接给出过程。 假设要插入直线 ,从根结
容斥原理
摘要:容斥原理是解决这一类问题的:有 个集合 ,求 。 我们就能发现,所有偶数个集合的交集前面都是减号,而奇数的前面的都是加号,也就是: \[|\bigcup \limits_{i=1
线段树分治
摘要:前置知识:可撤销化并查集 注意:可撤销化并查集的作用和删边不一样,其只能撤销最近的一次操作。 既然只需撤销,那么只需在在合并并查集时用个 vector 记录下合并的哪两个点,撤销时就直接还原就行了。 这里要强调一下,可撤销化并查集不能路径压缩,只能启发式合并。 代码 int f[MAXN], sz[
博弈论
摘要:有向图游戏 给定一个有向图,初始在结点 上有一个棋子。两名玩家将轮流移动这个棋子到相邻的一个点上。若有一方不能移动,则另一名玩家获胜。若两方都按最优方案操作,求最终是先手获胜还是后手获胜还是平局。 首先,若当前棋子所在的结点出度为 ,则先手必败。 很容易想到,若某个状态能转移到
异或哈希
摘要:简介 我们知道哈希就是把一个字符串转化为一个数字。但普通的哈希是有顺序的,而如果我们想判断两个集合是否相同,就需要使用异或哈希了。 思路 异或哈希,就是把每一种值映射到某一个随机数上,再把它们异或起来。因为异或具有交换律,所以可以比较集合。 但我们怎么保证异或哈希的正确性呢? 假设我们随机的值域为
动态 dp
摘要:首先看到以下这个问题: 有 个饼干,第 个饼干的美味值为 ,你可以吃任意不相邻的一些饼干。还有 次询问,每次询问将修改一个饼干的美味值,问美味值之和最大能是多少。 我们尝试通过线段树的思想来解决,但这时又会有一个新的问题:合并左右儿子的信息。 这里我
扫描线
摘要:简介 扫描线,顾名思义,就是一根线扫过去。 矩形面积并 给定平面直角坐标系上 个矩形,每个矩形的边均平行于 轴或 轴。求这些矩形的面积并。(被多个矩形覆盖的区域只算一遍) 首先考虑一维上的问题:有 条线段,求这些线段的长度并。比如下图: 令线段左端点为
自动机
摘要:简介 自动机是一种通过状态之间的跳转进行计算的数学模型。 当自动机接受一个输入字符时,它使用状态转移函数,依据当前所处的状态和输入的字符跳转至下一个状态。我们常常使用有向图表示一个有限状态自动机。此时,状态在有向图上以结点形式表示;状态转移函数表示为这张图上的有向边的集合。 比如说判断一个二进制串的
二分图最大匹配
摘要:简介 二分图最大匹配是这样一个问题:给定图 ,存在点集 满足:\(V_1 \bigcap V_2 = \emptyset 且 V_1 \bigcup V_2=V 且\neg \exists u,v \in V_1 使 (u,v)\in E 且 \neg
笛卡尔树
摘要:简介 首先我们看到这个序列 ,现在我们找到它的最大值 ,并从中间劈开,此时分为了两个序列 和 ,接着对这两个序列继续这样的操作。 现在,将劈开后序列最大值和被劈开的数建立父子关系,于是便建立了这个树:
01字典树和可持久化01字典树
摘要:01字典树 01字典树是一种只有0和1两种边的字典树。可以解决查询第 小,查询 是第几小等问题。 查询第 小 可以把输入的数转成等长二进制,然后插入01字典树。比如将 插入字典树: 这里红色数字表示以该段为前缀的数的个数,黑色表示对
概率期望
摘要:简介 样本空间:所有的可能组成的集合。 随机变量:就是一个在样本空间中的随机的变量。 概率:一种情况的方案数除以总方案数。一个随机变量 的概率写作 。 期望:所有情况的平均值。一个随机变量 的期望写作 。 比如投一个硬币两次,那么它的样本空间就
高斯消元和矩阵快速幂
摘要:高斯消元 高斯消元是一种能在 的时间内求解 元一次方程组的算法。 其思路大致如下: 使第一个未知数只有第一个式子中系数非 。 使第二个未知数只有第二个式子中系数非 。 \(\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
树上背包
摘要:简介 树上背包,顾名思义,就是在树上做背包。 比如这道题: 收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转
区间众数问题
摘要:简介 一个数列的众数是指其中出现次数最多的数,求解区间众数问题有很多种方法。 方法1 注意,此种方法只用于求解众数出现次数。 使用莫队求解。 可是如何维护呢? 首先进行离散化。 我们定义 表示数字 在当前区间中的出现次数, 表示当前区间中出现次数为
折半搜索
摘要:简介 折半搜索是一种优化搜索的方法,一般可以将 优化为 。其思想为将一个搜索拆分成两个搜索,分别处理前一半和后一半,使用 map 或 vector 等东西记录第一次搜索的信息,在第二次搜索时查询。 如以下代码: void dfs(i
莫队
摘要:简介 莫队是一种离线求区间信息的算法,可以做到 。莫队中使用了分块的思想。 首先考虑一个问题:给定一个长度为 序列 和 次询问,每次询问查询区间 的和。(请先忘掉前缀和、线段树、树状数