非确定性算法
我也不知道这种东西有什么用。即使考场上出了正解是随机化的,我估计也看不出来。
哈希
这类太多了。除了串串 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)\)。

浙公网安备 33010602011771号