UOJ 杂题选

uoj 杂题选做。

513.【UR #19】清扫银河 \(\color{green}\texttt{战胜}\)

题意:一张 \(n\) 个点 \(m\) 条边的图,每条边有边权 \(0\)\(1\)。每次操作可以选择一个简单环,将环上边权翻转;或者选择一个点集 \(S\),将两端连接 \(S\) 内和 \(S\) 外的所有边边权翻转。求 \(m+1\) 次操作能否使得所有边权为 \(0\)
\(n\leq 300,m\leq n*(n-1)/2\),无自环重边。

求出生成森林后,每一条非树边会对应一个环,称这些环为单位环。那么任意一个简单环可以由若干单位环异或而成。同样的,选择一个点集 \(S\) 一起操作也能拆分成多次操作,每次操作选取 \(S\) 内一个点。所以我们可以将操作拆分成两类单位操作:

  • 选择一个单位环,翻转环上边;
  • 选择一个点,翻转所有一端为它的边。

操作次数可能会爆炸。但是发现操作二可以合并回去变成一个操作,所以总操作数 \(\leq m-n+1+1\leq m-1\),即只要有合法操作就可以保证步数。

把每个操作写成一个二进制向量,问题转化为初始边权向量是否与这些操作向量线性无关。使用线性基立刻得到一个 \(O(\dfrac{Tm^3}w)\) 的做法。

考虑优化:发现对于那些非树边,只会有三种情况改变这条边边权:两端和单位环。那么若把非树边的那些维度设为高维,把所有表示单位环的向量插入线性基后,是不会产生任何消元的(因为它们的最高维分别是它们所对应的非树边,两两不同)。那么当我们再插入一个表示选点的操作时,这个向量与表示单位环的向量异或,只会改变最低的生成树大小维以及前面某一维,单次插入复杂度是 \(O(\dfrac{nm}w)\),是可以接受的。插入所有向量后查询插入初始情况向量是否会增加秩即可。

复杂度 \(O(\dfrac{Tn^2m}w)\)

https://uoj.ac/submission/751230

514.【UR #19】通用测评号 \(\color{red}\texttt{战败}\)

题意:\(n\) 个变量,初始都为 \(0\)。每次随机选择一个 \(<a\) 的变量 \(+1\),求所有变量都 \(\geq b\) 的时候 \(=a\) 的变量数期望。
\(1\leq n \leq 250,1\leq b<a\leq 250\)

所有变量相同,那么只用求变量 \(1\) 在结束的时候 \(=a\) 的概率即可,答案为这个东西 \(*n\)

遇到这种若干个变量操作,但是达到一定条件就不能操作的概率问题,有一个引理:把这些不能操作的当作可以操作,且操作后这个变量是什么样子不管,那么两个问题的答案是一样的。

在这一题的具体应用,可以把选择一个 \(<a\) 的变量去掉换成选择任意一个变量,那么答案不会改变。

那么这样还是不好做,因为序列的长度可以无限长。但是发现变量 \(1\) \(\geq a\) 或者其他变量 \(\geq b\) 后再加是不会改变什么东西的,所以反向用这个引理后,操作序列长度变为了 \((n-1)b+a\)

现在的问题是,这么多操作序列中,有多少序列变量 \(1\) 不是最后一个到达界限的,即 \(T_{(n-1)b+a}\neq 1\)

正难则反,选定最后一个为 \(1\)。考虑使用类似于 mex 问题中延后分类的 trick。对于一次操作,在这个位置先乘上它的概率,在后面再考虑它到底是什么数。

于是设 \(f_{i,j}\) 表示考虑了 \(i\) 个操作,已经有 \(j\) 个非变量 \(1\) 的变量到达界限了的概率。有转移:

\[f_{i,j}\leftarrow f_{i-1,j}\dfrac{1}{n-j}+f_{i-1,j-1}\dfrac{1}{n-j+1}\dbinom{i-1-(j-1)b}{b-1}(n-j) \]

即目前这个状态是否使某个变量到达界限。分数表示目前的概率(已经到达界限的不能选,其它等概率)。在使某个变量到达界限的时候,首先选择之前哪些操作是这个变量,再选这个变量是哪一个。

最后的答案是 \(n(1-f_{(n-1)b+a-1,n-1})\)

复杂度 \(O(n^2a)\)

https://uoj.ac/submission/751288

681.【UR #22】月球列车 \(\color{green}\texttt{战胜}\)

题意:多次询问,每次给 \(x\),求 \(a_i+x\) 的异或和。强制在线。
\(n\leq 2.5\times 10^5, a_i\leq 2^{60}\)

考虑拆位,\(a_i+x\) 的第 \(k\) 位(记为 \((a_i+x)_k\))相当于 \((a_i)_k\operatorname{xor}(x)_k\operatorname{xor}[(a_i)_{[k-1,0]}\geq 2^k-x_{[k-1,0]}]\),相当于设 \(b_{i,k}\) 表示 \((a_i)_{[k,0]}\),要对于每个 \(b_{*,k}\) 求其中有多少个数大于某个数(即每一位的进位次数)。

\(2\log\) 是简单的,对 \(b\) 排序然后二分查找即可。

离线也是简单的,对 \(x\) 排序然后归并即可。

考虑在线 \(1\log\) 做法,观察每次进位的要求:\((a_i)_{[k-1,0]}\geq 2^k-x_{[k-1,0]}]\),可以发现,若 \(k\to k+1\),每个左边项,每个右边项都是要么 \(+0\),要么 \(+2^{k}\)

于是可以考虑求出 \(c_{k,i,0/1}\) 表示最大的 \(x\) 使得 \(b_{i,k}+(0/1)*2^{k+1}\geq b_{x,k+1}\),那么每次 \(k\to k+1\),这个不等式的边界可以直接由跳 \(c\) 数组得到。

细节非常多:可以在 \(a\) 数组中插入 \(0,2^{62}-1\) 来避免 \(c\) 数组跳到边界;求 \(b,c\) 数组可以从高位往低位递推,每次去掉一位相当于一个归并,然后找到这一位 \(0/1\) 的边界就是 \(c\)。注意下标问题,每一次到底是找哪一位的数组值。

如果按照我的写法,最后对于最高位可能还要在 \(x\neq 0\) 的时候 \(-2^{62}\)

https://uoj.ac/submission/790013

706.【UER #10】随机薅羊毛 \(\color{green}\texttt{战胜}\)

题意:有 \(n\) 个抽奖机,每个机器有 \(p_i\) 的概率抽到。一个人每次等概率随机选择一个与上一次不同的机器抽奖(第一次随意),求抽到奖的期望次数。
\(n\leq 1e6\)

\(f_i\) 表示这次选了 \(i\) 抽到奖的期望次数。有:

\[f_i=p_i+(1-p_i)(1+\dfrac 1{n-1}\sum f-\dfrac 1{n-1} f_i) \]

能得到:

\[f_i=\dfrac{n-1}{n-p_i}+{1-p_i}{n-p_i}\sum f \]

所有式子相加得:

\[\sum f=(n-1)\sum\dfrac 1{n-p_i}+\sum f\sum\dfrac{1-p_i}{n-p_i} \]

答案是 \(\dfrac 1n\sum f\),解即可。注意这个做法需要使用 __float128 才能不掉精度,,,

https://uoj.ac/submission/752181

posted @ 2025-04-23 08:21  KiharaTouma  阅读(17)  评论(0)    收藏  举报