非确定性算法
我也不知道这种东西有什么用。即使考场上出了正解是随机化的,我估计也看不出来。
哈希
这类太多了。除了串串 Hash,主要讲几个经典的。
P2757
显然 \(len>3\) 没用。
排列。重要条件。
枚举等差中项,发现不存在以其为中项的等差序列,等价于,其他两项都在同一边。
也就是在值域标成 01 序列,大概是一个回文的。
线段树维护正反 Hash。复杂度一个老哥。
随机映射
CF1746F
判断出现次数是 \(k\) 的倍数,不是那么好做。
这种题目需要猜到一个足够强的必要条件。这里是,\(k|\sum_{l\le i \le r}a_i\)。然后大概随个 50 轮,每轮给 \(a_i\) 随机映射一下。
正确性概率的话,假设一个错误的和,做随机映射之后对了,可以认为他是在 \(\bmod k\) 的时候随机了一个余数,那随到 \(0\) 的概率大概就是 \(\frac 1 k\)。那随个 50 轮就几乎为 \(0\) 了。
CF1641D
这个题告诉我们,不要算错正确概率。
第一反应就是把大大的值域随机映射到 \([0, 20)\) 上。
然后这里正确概率是 \(\binom{15}5\div\binom{20}{5}=0.2\) 不是 \(\binom{20}{10}\div \binom{20}{5}^2=7\times 10^{-4}\)。
那你随个 20 次正确概率高达 \(99\%\)。(但是测试点很多可能会挂?)
可以高维前缀 min 做。复杂度 \(O(cn+c\times 20 \times 2^{20})\)。\(c\) 是随机次数。
随机赋值
这里有两个矩阵题,总的来说都是用低复杂度的向量乘,换高复杂度的矩阵乘。
QOJ5825
随 20 个向量乘上去,看 \(v\times A \times B=v\times C\) 是否成立就好。因为向量的乘法是 \(O(n^2)\) 的。
P1224
两个向量数量积,就是其中一个转置一下,再乘起来。即 $v_1\cdot v_2=v_1\times v_2^{\text { T}} $。
那我们把 \(n\) 个向量堆成一个 \(n\times d\) 的矩阵 \(A\),计算 \(B=A\times A^\text T\)。发现 \(B\) 的意义是,\(B_{i,j}=v_i\cdot v_j\)。
- \(k=2\):发现只要找到 \(B_{i,j}=0\) 就是答案。那考虑 check 是否全 \(1\)。多随几个行向量 \(t\),拿 \(B\) 右乘一下,看看得到的行向量的每个元素是不是都是 \(t\) 中每个元素的和。向量乘矩阵,复杂度是平方的。
- \(k=3\):注意到 \(B\) 每个元素平方之后,\(1,2\) 都会变成 \(1\),再进行 \(k=2\) 就好。但是这里不能直接计算矩阵乘法之后某个元素平方之后的值,考虑拆 \(res_j=\sum_{i=1}^n v_{1,i}\sum_{k=1}^d\sum_{l=1}^dA_{ik}A_{il}A_{kj}^{\text { T}}A_{kl}^{\text { T}}\),可以拆出来一个 \(d\times n\) 的矩阵和 \(A\) 预处理的形式,剩下来直接枚举,复杂度 \(O(nd^2)\) 可以接受。
总复杂度 \(O(nd^2c)\),\(c\) 是随机次数。
随机打乱
P7606
经典结论是,数轴上从原点开始每次随机正负号,移动 \(1\) 单位长度,走到的位置的绝对值最大值是 \(O(\sqrt n)\) 级别的,而且常数不大。
然后这题就是一个背包,游走的限制可以根号一下,总复杂度 \(O(\frac {n^2p^2}w)\)。

浙公网安备 33010602011771号