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\)

posted @ 2024-09-26 15:44  s1monG  阅读(12)  评论(0)    收藏  举报