非确定性算法

我也不知道这种东西有什么用。即使考场上出了正解是随机化的,我估计也看不出来。

哈希

这类太多了。除了串串 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\) 是随机次数。


然后这里有两个 colour-coding 的题。

P7450

首先别管这个傻逼中位数。那么 colour-coding 就是把每种颜色随机映射到一个 \([0, k)\) 的整数中,达到能够状压的水平。
然后就是【模板】最小斯坦纳树。

考虑带上中位数怎么做。那么首先跑一遍 Steiner,保证答案最小
在这个基础上,二分中位数,给美味值 \(\le mid\) 的权值标为 \(+1\)\(>\) 的标为 \(-1\)。那么带着一个 pair(双关键字比较)跑 Steiner,看 second 是不是非负。

然后关于正确概率,一个方案被随机映射之后仍然有正确性的概率显然不小于 \(\frac {k!}{k^k}\)。以上。

ARC213C

好像是一个世纪好题。官解并不是随机化,这里讲一下 colour-coding。

题意转化为,给 T1 中 \(k\) 的每个子树染不同颜色。在 T2 中找不同子树中,颜色不同的 \(4\) 个点,权值和最小。

那么对于每个 \(k\),随机上色之后,对 T2 中的 \(k\),处理出来 \(F_{colour,v}\) 表示 \(v\) 子树内,颜色为 \(colour\) 的最小值,统计答案的时候怎么状压一下就好。那由于 \(\sum deg_u =O(n)\),所以复杂度是可以接受的。

可做到 \(O(n\log n)\)。不是重点,稍微提一下。
关于 \(F\) 的计算:考虑重链剖分,对于每个 \(k\) 的轻子树暴力枚举轻子树,这个总枚举量是 \(O(n\log n)\) 的。
然后对于重儿子,和“父亲为根”的子树,可以写成 \(O(1)\) 个 T2 上 DFS 序的区间,那么我对于 T1,我能够支持:提前把结点 re-id 成 T2 上的 DFS 序,然后对于一个子树,区间查权值最小。

那很暴力的做法是,值域线段树合并。一个老哥。而且这部分是可以不乘上随机次数的,放在外面预处理。那么随个 300 次可以通过。

upd:我草这个太石了,又是 7kB 的一天/tuu 提交记录挂一下。

随机赋值

这里有两个矩阵题,总的来说都是用低复杂度的向量乘,换高复杂度的矩阵乘。

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)\)

posted @ 2026-01-14 09:49  Water_M  阅读(21)  评论(0)    收藏  举报