第 332 场周赛
Date: 2023-02-12
A 找出数组的串联值
模拟,只要熟练掌握 API 即可
复杂度分析
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(1)\)
B 统计公平数对的数目
首先可以把它看做是无序对,然后求出总数之后除以 2 即可得到有序对的数量。
枚举其中一个数字 \(\textit{nums}[i]\),然后只需求出符合要求的 \(\textit{nums}[j]\) 的数量:\(\textit{lower} - \textit{nums}[i] \le \textit{nums}[j] \le \textit{upper} - \textit{nums}[i]\)。
通过二分,找到最小的 \(x\) 满足 \(x \ge \textit{lower} - \textit{nums}[i]\),在找到最小的 \(y\) 满足 \(y \gt \textit{upper} - \textit{nums}[i]\)。\(y\) 的位置减去 \(x\) 的位置即可得到与 \(\textit{nums}[i]\) 配对的数量。
注意,这里面可以包含 \(\textit{nums}[i]\) 自己,所以如果 \(\textit{lower} - \textit{nums}[i] \le \textit{nums}[i] \le \textit{upper} - \textit{nums}[i]\)。此时答案需要减去一。
复杂度分析
- 时间复杂度:\(O(n\log n)\)
- 空间复杂度:\(O(1)\)
C 子字符串异或查询
由于题目的数字限定在 \(10^9\) 范围内,所以二进制长度不会超过 \(30\),我们只需预处理出每一个区间长度不超过 \(30\) 的区间,将它们作为候选答案放在一个哈希表中。
注意按照左端点从小到大枚举,可以天然避免判断多个答案左端点相同的情况,只需考虑选择最短的即可。
复杂度分析
- 时间复杂度:\(O(30n)\)。
- 空间复杂度:\(O(30n)\)。
D 最少得分子序列
思路很简单,因为考虑的删除字母下标最大值与最小值的差,所以我们只需要考虑两边的字符串能否构成 \(s\) 的子序列即可。
因此,预处理前缀 \(l\) 和后缀 \(r\) 数组,\(l[i]\) 表示 \(t[0...i]\) 最短对应到 \(s[0...l[i]]\) 的子序列。
然后双指针遍历,取 \(r - l + 1\) 最小的作为答案即可。注意边界情况的处理。
复杂度分析
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(n)\)