CF2008场题解

Sakurako's Exam

算法:模拟,分类讨论。

题意简述:给 \(a\) 个数字 \(1\)\(b\) 个数字 \(2\),问能否在每个数字前加上加减号使得原始值为 \(0\)

考虑 \(1\) 的个数如果是奇数,那么一定不行。否则如果 \(2\) 的个数是偶数,一定可以。当 \(2\) 的个数为奇数且还可能可以时,判断是否存在 \(1\) 能够抵消一个 \(2\) 即可。

Square or Not

算法:模拟。

题意简述:定义美丽的矩阵为:最外层全部为 \(1\),其他全部为 \(0\) 的矩阵。现在问能否把一个字符串 \(s\) 写为美丽的矩阵。

我们设 \(s\) 长度为 \(n\)。显然若 \(n\) 不是平方数,一定不行。否则我们暴力判断即可。

Longest Good Array

算法:模拟,数学。

题意简述:定义好序列为满足 \(a_{i+1}-a_i>a_i-a_{i-1}\) 的序列,问如果一个序列的最小值为 \(l\),最大值为 \(r\),且这个序列为好序列,求其最大长度。

首先若 \(l=r\) 则答案为 \(1\)。否则我们暴力枚举当前差,每次让差加上 \(1\),判断当前项是否超过 \(r\),超过则输出答案,否则继续。

Sakurako's Hobby

算法:搜索,图论。

题意简述:给定一个排列 \(p\),问每个位置通过走边 \(i\rightarrow p_i\) 能到达几个 \(s_i\)\(0\) 的点。

首先图中肯定是一堆环,于是如果发现某个位置没有遍历过,直接暴力走边,同时记录经过的符合要求的点的数量,最后对这个环上的所有点赋值答案。

Alternating String

算法:模拟。

题意简述:定义交替字符串为奇数位置上的字母全部相等,偶数位置上的字母全部相等且字符串长度为偶数的字符串。现在有两种操作,一种是删除一个字母(最多执行 \(1\)),另一种是把一个字母替换为另一个字母。现在问把字符串 \(s\) 变为交替字符串的最小操作次数。

考虑如果 \(s\) 长度 \(n\) 为偶数,则判断技术位置和偶数位置上哪个字母更多,变成哪个即可。

如果是奇数,则我们记录一个后缀和为每个字母在奇数/偶数位置上出现的次数。然后扫一遍字符串,扫到的字符串代表删除它,然后分别找出奇数位置和偶数位置上出现最多次数的字母看能否更新答案即可。

Sakurako's Box

算法:数学。

题意简述:给一个序列,求出两两不同位置的数的乘积的期望值。

首先一共有 \(cnt=\dfrac{n\times(n-1)}{2}\) 对数。然后记 \(sum\) 为所有数的和。对于每个位置,先进行 \(sum\leftarrow sum-a_i\),然后 \(res\leftarrow res+sum\times a_i\)。最后答案即为 \(\dfrac{res}{cnt}\),使用乘法逆元计算即可。

Sakurako's Task

算法:数学,二分。

题意简述:定义 \(mex_k\) 为一个序列中第 \(k\) 个未出现的自然数。现在要求最大化 \(a\) 序列的 \(mex_k\),输出 \(mex_k\) 的值。

我们设 \(d\) 为所有 \(a_i\)\(\gcd\),于是有最后 \(a_i\)\((i-1)\times d\)。对答案二分即可。

Sakurako's Test

算法:数学,二分,前缀和。

题意简述:给一个序列 \(a\),现在 \(q\) 次询问进行操作 \(a_i\leftarrow a_i\bmod x\) 后,其第 \(\dfrac{n}{2}+1\) 大的数,询问之间相互独立。

我们开个桶维护每个数出现的次数,然后做一下前缀和。然后对于每个可能的 \(x\),预处理其答案。每次二分中位数 \(mid\),然后前缀和快速找出模 \(x\) 不超过 \(mid\) 的数的个数,每次找数复杂度为 \(O(\log n)\)。这样我们的时间复杂度为 \(O(n\log^2 n+q)\)

代码

posted @ 2024-09-02 11:05  zxh923  阅读(19)  评论(0编辑  收藏  举报