专栏文章
Random Hash
算法·理论参与者 1已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miqjhxk2
- 此快照首次捕获于
- 2025/12/04 05:49 3 个月前
- 此快照最后确认于
- 2025/12/04 05:49 3 个月前
模型 :给定一个长度为 的序列 ,可以有重复元素,问:
给定一个子区间 ,如何判断 中所有数都出现了偶数次。错误的概率是多少。 给定一个子区间 。根据 ,已知区间 有的元素出现了奇数次, 如何判断 中 有且仅有 一个数出现了奇数次。错误的概率是多少。
-
-
给每一个在序列中出现的数 随机地赋上一个 内的数 。考虑到若区间 的数都出现了偶数次,则区间异或和必然为 。因此,若区间 的 的异或和为 ,我们就认为 的数都出现了偶数次。
-
一个结论:假设有一个集合 ,里面的元素在 完全随机,并且 至少存在一个数出现了奇数次,则我们认为 不管集合 有多少个元素, 内部所有元素的异或和 等于 内的某一个数 的概率均为 (即把所有数异或起来的结果等价于给一个变量 随机赋一个 的权值)
-
当区间 有的数出现了奇数次,但区间异或和为 时,答案会出错。根据刚才的结论,出错的概率为
-
-
-
设区间 的 的异或和为 ,若 在 序列 中出现,我们就认为区间 只有一个数出现了奇数次。
-
当区间 有多个数出现了奇数次且区间异或和 在 中出现过。错误的概率最坏为 。由于 在原序列中出现的概率就已经很小了,所以我们不需要再去判断 是否在区间 中出现过
-
模型 :给定两个集合 和 ,问:
若 和 均满足内部 无重复元素 出现,如何判定 和 全等。错误的概率是多少。 若 和 内部均可能 存在重复元素,如何判定 和 全等。错误的概率是多少。
-
-
给 和 每一个出现过的数值 赋上一个 的数值 。若 所有元素 的异或和 等于 所有元素异或和 ,则我们认为 和 全等。
-
当 和 不全等(即存在一个数只在 或者 出现),并且 时,会出错。考虑让 和 相同元素抵消。这样,对于一个没有被抵消的数 ,它要么只在 中出现一次,要么只在 中出现一次。因此 和 两个变量就 独立 并且完全在 随机。
-
-
-
由于集合内有重复元素,所以异或的方法不管用了(比如 ,)。考虑令 为 所有元素的 的和, 为 所有元素 的和。若有 ,我们认为 和 全等。
-
如何计算错误的概率?考虑消去 和 公共元素,则 和 独立,并且在 内完全随机。则错误的概率为
-
模型 :给定一个序列 ,问:
给定一个整数 。然后再给 组询问,每次询问给定两个参数 和 ,表示询问区间 内是否所有数出现次数都是 的倍数。 给 组询问,每次询问给定三个参数 ,, 表示询问区间 是否所有数出现次数都是 的倍数。
-
给每一个出现的数 随机赋一个 内的权值 ,使得 个相邻的并且相等的 异或和为 (注意,它们三个在原序列中不一定相邻),这样,若所有数出现次数都是 的倍数,则区间异或和必然为 ,错误的概率为
-
给每一个出现过的数 随机赋一个权值 ,求出这个区间 值的和 ,若 不是 的倍数,输出
NO。错误的概率最坏为 ,随机 次,错误的概率最坏为
P4065 [JXOI2017] 颜色
给定一个长度为 的整数序列,每一个数都有一个颜色 定义“删除颜色 ” 为把所有的满足 的 删掉。问有多少种删除颜色的方案,使得最后剩下的数形成原序列的一个子区间。 例如,假设 初始为 ,若删掉颜色 ,则变为 和 ,不是一个子区间;若删掉颜色 ,则变为 ,是一个子区间。 两个方案不同当且仅当至少存在一个颜色 只在其中一个方案中被删去。 ,
-
设 为删除后的子区间,则任意一个在区间 的颜色 ,都应该满足:序列中 所有的 颜色 只在 区间 出现。
-
考虑给每一个位置 赋一个 范围内的数 ,并且要满足,对于任意一个颜色 ,所有满足 的 的异或和为 。
-
而当一个区间 区间异或和为 ,并不能保证区间 是合法的。当一个区间 区间异或和不为 时,却 一定 能保证区间 是非法的。
-
因此,我们考虑当区间 异或和为 时(即当区间 不合法但区间异或和为 时),出错的概率。
-
区间不合法意味着存在一个颜色 ,使得颜色 不只是在区间 出现。此时我们认为区间 异或和在 中等概率出现,因此判定一个区间是否和合法区间时,出错率为 ,正确率为 。
-
设 表示 的异或和。则剩下的任务是统计有多少个区间 使得区间 即
S2oj #1497 树
给定一棵 个结点的树,树上每条边有边权 给你 组询问,每次给定 和 ,问 这条路径上的边权是否能重新排列,形成一个回文序列。强制在线。 ,
-
若一个序列可以形成回文序列,需要满足以下两个条件 之一:
-
-
若序列长度为奇数,则有且仅有一个数出现奇数次。
-
若序列长度为偶数,则不存在一个数出现奇数次。
-
-
给每一种边权 随机赋上一个在 的值 。
-
设 表示 路径上所有 的异或和。
-
则查询时判定 是否等于 或者等于某一个在 树的边权 出现过的 即可。
-
考虑单次查询错误的概率,即当路径上不满足条件 和条件 时,异或和等于 或者某一个 的概率,最坏为 ,是一个非常小的数值。
CF869E The Untended Antiquity
给定一个 的网格。 次操作,每次给定三个参数 ,,,,
- 若 ,表示给以 为左上角, 为右下角的矩形围上篱笆。
- 若 ,表示给把以 为左上角, 为右下角的矩形的篱笆拆掉(保证这个篱笆存在)
- 若 ,表示查询方格 和方格 是否连通
数据保证任意修建的两个篱笆都不相等,并且对于任意两个篱笆,要么包含,要么完全不相交。 ,
-
考虑如何判定两个方格连通。给每一个篱笆一个编号,设围住 的篱笆集合为 ,围住 的篱笆集合为 。发现若满足 ,则 和 连通。
-
如何判定两个集合全等?考虑给每一个编号(编号记做 )的篱笆赋一个 的权值 。则只需要判断 内所有 的异或和 是否等于 内所有 的异或和 。
-
如何给一个矩形范围内所有的方格的集合 都添加上编号 ?使用二维差分 二维树状数组即可。
ABC 250E Prefix Equality
给定两个长度为 的数列 和 。 有 组询问,每次询问给定两个参数 和 ,询问 排序去重后形成的序列 ,是否等于 排序去重后形成的序列 。 ,
-
考虑模型 ,给每一个在 或者 出现过的数随机赋一个 的权值。
-
维护 的异或前缀和 和 的异或前缀和
-
对于 ,如果存在一个 使得 ,则只需令 即可。否则令
-
最后判定 和 是否相等即可。
CF1418G Three Occurrences
给定一个长度为 的序列问有多少个子区间满足:所有数都 恰好 出现了 次。,
-
对于一个区间 ,若区间 所有数出现次数恰好为 当且仅当:
-
-
所有数出现次数都
-
所有数出现次数都是 的倍数。
-
-
枚举右端点 ,考虑统计 有多少个 使得区间 满足条件。
-
对于 ,枚举 的同时维护最小的 ,使得当 满足 时,有 所有数出现次数不超过 。
-
给每一个数 随机赋一个 内的权值 ,使得三个相邻的值相同的 ,, 异或和为
-
然后求出 的前缀异或和 ,即 的异或和。
-
对于一个区间 ,若满足 ,即 ,则我们认为区间 所有数的出现次数是 的倍数。错误概率为 。
-
那么剩下的任务就是对于一个 ,统计 内有多少 使得 ,用
std::map作为桶即可。
P8819 [CSP-S 2022] 星战
给定一张 个点 条边的有向图 给定 个操作,首先给定一个参数 表示操作类型:
若 ,表示摧毁一条边 ,数据保证这条边存在。 若 ,表示摧毁所有指向 的边 若 ,表示恢复一条边 ,数据保证 这条边已经被摧毁。 若 ,表示恢复 最初 所有指向 的边 每次操作后,请判断当前的图是否是一个内向基环树森林。如果是输出YES,否则输出NO。 ,
-
内向基环树森林 所有的点有且仅有一条出边。
-
最直接的想法是给每一个点 维护一个 表示 的出度,每次操作完之后看看所有点的出度是否都是 。但是对于 和 就有些棘手了,因为对于所有的 ,我们需要给所有的 执行 或者
-
发现似乎维护每一个点的入度更方便一些。但入度并不能帮助我们判定一个图到底是否是内向基环树森林。
-
考虑把每一条边 的出点 放到一个多重集合 , 然后把 每一个点放到一个多重集合 里。发现如果我们想判定这个图是否是內向基环树森林,我们只需要判定 和 是否全等。
-
立刻想到模型 ,给每一个点 随机赋一个 范围内的数 。设 表示集合 的 的和。若要判定 和 是否全等,我们只需要判定是否
-
设 表示所有指向 的点 的 之和。设 表示 最初 指向 的点的 的 之和。
-
-
若 ,令 ,
-
若 ,令 ,
-
若 ,令 ,
-
若 ,令
-
CF1746F Kazaee
给定一个整数序列 ,有 次操作,每次操作有两种类型:
把某一个位置 的值修改成 ,即 给定 ,, 三个参数,每次询问是否区间 的数出现次数都是 的倍数。 ,
-
给每一个出现过的值 随机赋一个在 的值 。如果所有数在区间 出现次数都为 的倍数,则区间 内所有数的和一定为 的倍数!
-
当区间 存在一些数出现次数不是 的倍数,而区间和是 的倍数时,答案会出错。感性证明:肯定是 越小,冲突的概率越大,则 最小可以取 (因为 肯定输出
YES);肯定是当区间内只有一种数的时候随机性更强一些。 -
则设这个数为 ,以及其出现的次数 ,则需要计算 的概率。令 ,再令 ,,最终使得 和 互质。则需要满足 ,而由于 ,则 。由于 纯随机,所以错误的概率最坏是
-
重复上述操作 次:给所有值随机赋值,用树状数组或者线段树维护区间 值的和,只要这 次内有 次发现区间和不是 的倍数,就可以直接判定本次询问为
NO。 -
错误的概率为区间不满足每一个数出现次数都是 的倍数,但是这 次每次区间和都是 的倍数,概率最坏为 ,可以接受。
-
注意每次随机时,不应该直接把 数组设置成
unsigned int或者unsigned long long。因为树状数组单点修改时,有可能会加上一个负数,而这两个数据类型是不能表示负数,会自动对 或者 取模,而取模之后 就失去了意义。
[ABC367F] Rearrange Query
给定一个长度为 的正整数序列 和 有 组询问,每次询问给定两个参数 和 ,问 重新排列后是否能等于 。 ,,
-
把 看做集合 ,把 看做集合 ,则只需判定集合 和 集合 是否相等即可。
-
由于 和 内部可能有重复元素出现,所以用 和哈希
Sum-Hash而不是异或哈希Xor-Hash -
给每一个在序列 或者 出现的数 随机赋一个 的数值
-
则维护 序列 的和 ,以及 序列 的和 。查询时,判断 和 是否相等即可。
完结撒花!欢迎勘误!
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...