2024.9.26 test
十三联测 #8
B
给定序列长度为 \(m\) 的序列 \(B\),随机生成值域为 \([1,m]\),长度为 \(n\) 的序列 \(A\)。\(n\le 10^5,m\le 100\)。
每次操作是令 \(A_i\gets B_{A_i}\),问使得 \(A\) 跟原来一样需要的最少的操作次数的期望。
手刃这个题。设 \(B\) 形成的置换环大小为 \(s_i\),那么 \(A_i\) 撒进第 \(i\) 个环的概率就是 \(s_i/m\)。
答案就是有 \(A_i\) 的置换环大小的 \(\text{lcm}\)。
注意到 \(s_i\) 不同的大小只有最多 \(15\) 种,大小相同的概率可以叠加,于是我们直接状压枚举。
求所有 \(A_i\) 都撒进某些环里的方案数,且每个环至少撒一个,这个用容斥算,钦定某些环不放。
然后容斥的话可以用高维前缀和处理。
C
给定长度为 \(n\) 的序列 \(a_i\),你可以无限执行 \(a_i\gets a_i\otimes a_{i-1}\) 的操作,问最长上升子序列。
\(n\le 100,a_i\le 10^{18}\)。
\(a_i\) 最后的取值是前缀 \(i-1\) 中每个选或不选求异或和再异或 \(a_i\) 的值。
然后我们就可以 dp 了,但是状态数是 \(O(2^n)\) 无法解决。
考虑更换状态设计,不妨设 \(f_i\) 表示长度为 \(i\) 的子序列最后的数最小是多少。
转移的话从 \(f_j\) 转移到 \(f_{j+1}\),需要满足存在 \(a_i\) 异或前面的数选/不选最后的值 \(>f_j\)。
这启示我们用线性基维护,也就是求异或 \(k\) 后 \(>x\) 最小的数。
上面这个的话考虑枚举高到低第一位比 \(x\) 大的位置,检验前面异或 \(k\) 后能不能被拼出来,
后面的位话求异或最小值即可。
D
每人有三个属性 \(a,b,c\),你可以花费 \(1\) 代价使得某属性加 \(1\)。
询问使得所有人可以形成某个排列每个属性都不减,最小的代价。\(n\le 250,a,b,c\le 10^9\)。
将三个属性都离散化,⽅便起见,属性的值相同也按多次计算,不去除重复。
设 \(f_{x,y,z}\) 表示当前考虑了三个属性分别排名不超过 \(x,y,z\) 的人的最小代价。
以转移到 \(f_{x+1,y,z}\) 为例,取出排名为 \(x+1\) 的这个人,若其 \(b,c\) 大于当前 \(y,z\) 就忽略。
否则,使其 \(b,c\) 增加到 \(y,z\)。

浙公网安备 33010602011771号