Loading

一个随机化的线索:至少一半

做了几道相像的题,总结了一个随机化可能的线索:找一个参数,使得数组中合法数数量大于一半(或者某个比较大的分数也行)。

AT_abc422_e

给定平面上的 \(N\) 个点(\(N\) 为奇数),问是否存在一条直线经过其中多于 \(\dfrac{N}{2}\) 个点。

我们假设直线存在,那么随便选一个点,它在这条直线上的概率是 \(\frac{1}{2}\)。那么随便选两个点确定一条直线,这条直线满足题意的概率就是 \(\frac{1}{4}\)。多随机几遍直线即可,错误概率是 \((\frac{3}{4} )^ k\)

CF1523D

一共有 \(m\) 个元素,给你 \(n\) 个集合,每个集合的元素不超过 \(15\) 个。求出一个元素个数最多的集合 \(T\),使得 \(T\) 是至少 \(\left\lceil \dfrac{n}{2} \right\rceil\) 个给定集合的子集。

我们想象那个最大的集合 \(T\),那么 \(n\) 个集合中随便选一集合 \(S\),那么 \(T \subseteq S\) 的概率是 \(\frac{1}{2}\),于是,我们枚举 \(S\) 的子集,验证后取最大值。随机枚举 \(k\)不同集合的子集,找不到最大子集的概率是 \((\frac{1}{2}) ^ k\)

总结

对比暴力做法(枚举每一对点/枚举每一个集合的子集)可以发现,这两题里,正是因为“一半”够大,错误率随枚举次数指数级降低,所以才允许枚举的点对/集合数量缩小到 \(\mathcal{O}(\log)\) 级别。这也算一种 \(\mathcal{O}(n ^ 2) \to \mathcal{O}(n \log n)\) 的优化。

posted @ 2026-07-24 09:51  Trent900  阅读(28)  评论(0)    收藏  举报