数据结构 Trick 之:分割问题的基于随机数的做法

能够解决的题目

给定一些集合。
有两个操作,分别是把一个集合分成两个;在线查询两个元素是否在一个集合。

思路

  1. 初始设全部权值为 \(0\)
  2. 分割时,将分割后的一个集合全部将权值加 \(rand\)
  3. 查询时只需看两点的权值是否相同。

证明:将分割后的一个集合全部将权值加 \(rand\) 时,两个集合之间两两点的权值就都不相等了,而两个集合内部的相等点还相等,符合分割操作的要求。

正确率:
设分割有 \(m\) 次,查询有 \(q\) 次。
每次查询时,两个数都被加了 \(O(m)\) 个随机数,设 \(p\) 为两个 \(O(m)\) 个随机数的和相等的概率,所以正确率就是 \((1 - p) ^ q\)
这个 \(p\) 为随机数值域的倒数,在值域为 \(10^18\) 时,已经有 \(1 - 10^{-9}\) 的正确率,所以随机数用 long long 即可。
要是实在担心,那就随机浮点数(可能常数大)。

例题

F - Adding Chords

线段树区间加过于简单,不放代码了。

posted @ 2025-09-21 09:07  porse114514  阅读(13)  评论(0)    收藏  举报