大家好,我是 Sora。这场周赛非常简单,所以没打。
个人感觉谁都可以 AK。
A. 数组去重
题目描述
给定一个长度为 $n$ 的整数数组对其进行数组去重。对于数值相同的元素,只保留位于数组最右边的那个。
去重完成后,剩余所有元素的相对位置应保持不变。
数据范围:$1≤n≤50,1≤a_i≤1000$ 。
解法 1
发现 $a_i$ 的范围很小,所以考虑桶。事实上范围大的时候离散化也可以。
试图暴力。用桶记录每个数最晚什么时候出现,然后通过 $O(n^2)$ 的循环来寻找当前桶内最小的数值,输出并归零。
解法 2
解法 1 其实还是不太妙。提出一个 $O(n)$ 的解法。
考虑倒序 + 桶,倒序扫描一遍,然后每次第一个出现就入栈,然后输出的的时候就按顺序出栈。
代码实现
输出数量的时候解法 1 可以在输入的时候每一次更新的时候减少一次 ans
,ans
最初为 $n$ 。
解法 2 可以直接 s.size()
。
CF 分数定位:$\color\gray{600}$。
B. 构造字符串
题目描述
给你一个 $n$ 位的字符串 $s$ ,求你构造一个 $k$ 位的字典序大于 $s$ 且字典序最小的字符串 $t$ ,$t$ 的字符集须是 $s$ 的子集。
数据范围:$1 \le n ,k \le 10^5$ 。
解法
不管为什么,先将字符集 $\Sigma$ 记录一下。
先考虑当 $k > n$ 的情况,这样就直接输出原字符串后面加上 $k -n$ 个字符集内编号最小的字符。
再考虑 $k \le n$ 的情况。我们考虑倒序处理。扫描到第一个字符 $c$ 满足 $c \not = \max(\Sigma) $ ,那么然后将该字符变成恰好比其大的那个字符。然后直接输出原字符串的对应字符就行。
时间复杂度 $O(26n)$ 。
代码实现
我们可以使用桶来存储字符集。当然,vector 也可以,不过有点麻烦。
其他的题解很清楚了吧。
CF 分数定位:$\color\green{1200}$。
C. 环形数组
题目描述
给你一个环形数组,要求支持如下操作:
- 区间加。
- 区间最小值。
注意,数组是环形的,所以当 $n=5$ 时,区间 $[3,1]$ 内的所有元素依次为 $a_3,a_4,a_0,a_1$ 。
数据范围:$1\le n,m \le 10^5$ 。
解法
线段树。这样的题也配出出来?对环两端进行特判处理即可。
代码实现
使用 getline()
读取字符串,然后对字符串进行处理。对于空格就拆分字符串,两个空格是操作 $1$ ,否则是操作 $2$。
CF 分数定位:$\color\green{1300}$。
sora酱~
虽说确实比较简单但也不能这样子说话吧,还是在公共分区
我没有骂人啊,你从哪看出我在骂人的
大佬tql