随机化题目合集

CF840D

题目链接

注意到一个很有趣的事情是,一个数如果在长度为 \(l\) 的区间中出现次数严格大于 \(\frac{l}{k}\) 次,那我从这个区间中期望随机 \(k\) 次就能随到它。

所以我们对于每个询问,都先随机 \(B\) 次,把随机到的数挂进一个 vector,我们对这里面的数进行 check ,把满足条件的数取个最小值即可。

现在问题在于快速 check。当然可以主席树或者挂若干个 vector 然后在里面 lower_bound,但是这样复杂度是 \(O(qB\log n)\) 的,我们希望有一些更为纯真的做法。

莫队,把 vector 挂下来,然后对询问跑莫队,维护当前区间内数字内出现次数即可 \(O(1)\) check。时间复杂度 \(O(n\sqrt{q}+qB)\)

CF364D

题目链接

很有趣的题目,但是忘了我啥时候做的。

考虑最终答案有啥性质,他一定是超过 \(\frac{n}{2}\) 个数的因子。这意味着我如果随机选一个数字 \(x\),我将其和其他数字取个 gcd 并把得到的 gcd 扔到一个桶里计数,然后对桶里的东西做 Dirichlet 后缀和,答案就有 \(\frac{1}{2}\) 的几率是出现次数大于 \(\frac{n}{2}\) 的数中的最大值。

那我多随几次就做完了,设随机次数为 \(B\),则错误率为 \(\frac{1}{2^B}\)。时间复杂度 \(O(B(d(V)^2+\sqrt{V}+n\log V))\)

CF1168E

题目链接

不会证明正确性/yun。

考虑随两个排列 \(p,q\),我们把所有不合法(即 \(p_i\oplus q_i\neq a_i\)) 的位置丢进队列里。每次随机调整 \(p\)\(q\)。调整一个排列时,拎出来 \(p\) 中数字为 \(q_i\oplus a_i\) 的位置和当前位置 \(i\) 交换。若这次交换使其不合法,则将其加入队列,直到队列被删空为止。

考虑如果出现循环交换的情况怎么办。设定一个阈值 \(B\),若重构 \(B\) 次仍未成功,则再次随机排列。

无解是 \(\oplus_{i=1}^n a_i\neq0\),必要性显然,但是我的随机没法证明他充分/zj。

CF643G

题目链接

先不考虑修改,考虑询问怎么做。

注意到 \(p\ge 20\),根据前面几个题的套路我们直到可以多随机几次,就有大概率随到正解。又因为有容错所以我们把出现次数的前 \(\min(\lfloor\frac{100}{p}\rfloor,siz)\) 大输出即可。

考虑一下正确性。最极端的情况是 \(p=51\),序列中有 \(51\)\(1\)\(49\)\(2\) 之类的情况。随机 \(B\) 次后,选择 \(k\)\(1\) 的概率是 \(\binom{k}{B}(0.51)^k\times(0.49)^{1-k}\),那么正确的概率是 \(\sum\limits_{k=\frac{B}{2}}^B\binom{k}{B}(0.51)^k\times(0.49)^{B-k}\)。这个东西的概率在 \(B=1000\) 时是 \(0.74\),但是出题人并没有特意卡掉这一做法。

考虑沿用 CF840D 一题的做法。那么我们考虑现在随机 \(B\) 次,每次检查当前随到的这个数是否满足题意。

那么现在变成了一个数据结构问题,支持两种操作,分别为:

  • 区间推平。
  • 区间求某个数字出现次数。

ODT。考虑拿 ODT 维护颜色连续段。开动态开点线段树维护一下每个颜色在该区间的出现次数。对于修改,暴力枚举 ODT 中的颜色段,对应的在线段树上修改,查询直接查。

分析一下复杂度。每次修改操作至多使颜色段增加一个,而每遍历到一个颜色段会让颜色段数量减一,故修改的均摊复杂度是 \(O(q\log n)\) 的,这与 ODT 的复杂度分析相同。询问的复杂度是线段树的 \(O(qB\log n)\)

再分析正确性,最极端的样例大概是 \(p=21\),然后给出 \(21\)\(1,2,3,4\)\(16\)\(5\)。这样的话错误率是 \((0.79)^B\) 的。取 \(B=100\),错误率是 \(10^{-10}\) 级别的。这样看起来还是比较有保证的。

有一些细节,放在下面。

  • ODT 最好先分裂右端点再分裂左端点,否则好像会出现 ub。
  • 在随机位置求颜色的时候,不要在 ODT 中 upper_bound 再求前驱,而是再开一颗线段树维护颜色。不知道为什么 upper_bound 非常慢,也有我写挂的可能。

P6982

题目链接

首先发现 \(\frac{n}{2}\) 是最奇怪的,考虑从这里入手。

假设我们知道了一个返回值为 \(\frac{n}{2}\) 的串,那么我们可以在 \(n\) 次操作后得到原串。具体做法如下。

首先取反第一位,然后对剩下的第 \(2,3,...,n\) 位按位取反。分情况讨论

  • 返回值为 \(\frac{n}{2}\),说明该位正确性与第一位不同。
  • 返回值为 \(0\),说明该位正确性与第一位相同。

在你得到了所有位与第一位的正确性关系后,将所有正确性不同的取反,做一次询问,返回值为 \(n\) 即为原串,否则为反串。

接下来考虑如何得到一个返回值为 \(\frac{n}{2}\) 的串。

大力随机!

考虑正确性,也就是说,我们要从 \(n\) 个位置中取出恰好 \(\frac{n}{2}\) 个位置使得该位与原串相同,剩下的不同,那一次成功的概率即为 \(\frac{\binom{\frac{n}{2}}{n}}{2^n}\)。那么在 \(500\) 次内问不出来的概率为 \((1-\frac{\binom{\frac{n}{2}}{n}}{2^n})^{500}\)。这个东西不会很大,因为 \(\binom{\frac{n}{2}}{n}\leq2^{n-1}\)。所以直接随机询问即可。

CF1746F

题目链接

首先 \(k\) 的倍数看起来就不像是普通数据结构能够维护的,而 \(n,q\leq 3\times 10^5\) 和带修让根号数据结构看起来也不太靠谱,对于统计数字出现个数我们可以考虑莫队,但是复杂度至少是 \(O(n^{\frac{5}{3}}\text{poly})\) 这种过不去的东西。

我们试图从头开始考虑。如果一个数 \(x\) 出现次数是 \(k\) 的倍数,那么其区间和至少应当被 \(k\) 整除。那么我们可以枚举每一个数字,计算其出现次数,判断其是否为 \(k\) 的倍数。

但问题是我们不能单个的做,考虑把所有数字打包判断。上面的做法告诉我们一个很好的性质是,如果所有数字的出现次数都是 \(k\) 的倍数,其出现次数之和也一定为 \(k\) 的倍数,当然这是必要不充分的条件。

接下来就是被出烂的套路。考虑每次随机取一个数集的子集判断,然后再次计算出现次数和。然后随机 \(B\) 个子集做这件事情。下面分析正确性,感性理解对于一个区间限制最坏的情况是存在一对数 \(x,y\),满足 \(k\mid cnt_x+cnt_y\)\(k\nmid cnt_x,cnt_y\),那么此时会被判错当且仅当 \(x,y\) 被全选或 \(x,y\) 全不选。注意到随机到判错情况的概率是 \(\dfrac{1}{2}\)。因此 \(B\) 次的错误率是 \(\dfrac{1}{2^B}\),取 \(B=30\) 即可。

时间复杂度 \(O(nB\log n)\),写线段树可能会被卡常。

P8819

题目链接

圣经

“根据最新消息,敌军摧毁了第45号、171号据点,我军依然顽强抗争,修复了据点37、98。现在可以反攻吗?”

“不可以,总司令。”

“敌军摧毁了第33号据点到42号据点的虫洞,现在可以反攻吗?”

“不可以,总司令。”

“我方修复了第42号据点,可以反攻吗?”

“不可以,总司令。”

“我方……”

“不可以,总司令。”

“同志,你只是一直在回答‘不可以’吗?你到底有没有好好判断形势?现在是关乎国家危亡的时刻……”

“总司令,您知道我不太聪明,没找到快速而正确地计算出结果的办法,但是据某项统计,我一直回答‘NO’的话,在一次战役中判断完全正确的概率是45%。”

“那……”

“不可以,总司令。”

题目相当于是判断是否原图为一颗内向基环森林。

首先注意到当边数和点数相同且构成内向基环树森林时,每个点出度都为 \(1\) 和每个点出度均为奇数

是一对等价条件,我们不妨转而维护这个条件,但是由于修改操作仍然不好维护。考虑更进一步,我们试图去维护入度和。对每个点 \(x\) 随机一个权值 \(w_x\),记 \(a_x\) 为以 \(x\) 为终点的有向边的条数乘上 \(w_x\),此时为内向基环树森林的必要条件为 \(\sum\limits_x a_x=\sum\limits_x w_x\),修改也是好维护的。

正确性分析的话本质上相当于是解一个多元一次方程,但是系数是随机的,所以正确性是有保证的。

CF1479D

题目链接

好像有一些根号的树莫队做法,但是我们是随机化合集(确信)。

沿用上一题的套路,出现次数为奇数是可以用异或刻画的。因此我们可以随机映射后判断路径的对应颜色区间异或值是否为 \(0\),不为 \(0\) 则说明有奇数。

现在的问题主要有两个,一是怎么维护路径信息,二是怎么构造答案。首先考虑第一个问题,由于异或有可减性,所以我们套路树上差分成维护到根节点的信息。然后问题在于如何维护区间,想这种每个节点继承前驱信息然后稍作修改的一般可以考虑主席树,对每个节点维护一颗主席树即可,询问时询问对应区间。那么还有第二个问题,我们直接主席树上二分,每次向一个异或值不为 \(0\) 的区间递归即可。

ARC158D

题目链接

最有脑子的一集。

注意到等式两侧次数相差恰好 \(1\) 且均为齐次式。记录左式为 \(F(x,y,z)\),右为 \(G(x,y,z)\),则如果我们能够构造出一组 \(x,y,z\) 满足 \(F(x,y,z)=kG(x,y,z)\),则 \(F(\dfrac{x}{k},\dfrac{y}{k},\dfrac{z}{k})=G(\dfrac{x}{k},\dfrac{y}{k},\dfrac{z}{k})\)。因此随机构造即可。唯一的问题是 \(k\) 不存在实数域的取值或取 \(0\),即 \(F(x,y,z)=0\)\(G(x,y,z)=0\) 的这种情况。但是官方题解经过一些分讨证明了出现这种情况的概率不大于 \(\dfrac{1}{4}\),所以复杂度有保证。由于我没看懂证明,所以这里不写了,感兴趣可以自行研究官方题解。

posted @ 2023-06-10 22:27  -Comρℓex-  阅读(79)  评论(1编辑  收藏  举报