Codeforces Round 849 (Div. 4)
A. Codeforces Checking
思路:
- 直接枚举,或者用库函数查找
时间复杂度:\(O(1)\)
1 | void solve() { |
B. Following Directions
思路:
- 根据给定的字符串指令模拟,观察在这个过程中是否经过糖果所在位置即可
时间复杂度:\(O(n)\)
1 | void solve() { |
C. Prepend and Append
思路:
- 直接双指针,分别从头尾扫描,直到出现两个字符都相同就停止
时间复杂度:\(O(n)\)
1 | void solve() { |
D. Distinct Split
题目大意:对于一个字符的价值,我们将其叫做 \(f(s)\),其定义为:一个字符串中字符出现的种类数。现在,我们可以把字符串 \(s\),分为两个子串 \(a, b\),求 \(f(a) + f(b)\) 的最大价值。
思路:
- 我们可以用双指针,分别从前后扫描,记录从前向后与从后向前的目前子串的种类数,然后我们枚举边界,直接取 \(max\) 即可
时间复杂度:\(O(n)\)
1 | void solve() { |
E. Negatives and Positives
思路:
- 由于是改变两个相邻的位置,那么我们一定可以让至少 \(n - 1\) 个数都是正数。
- 如果负数的个数为奇数:那么我们可以贪心的使得最小的那个数为负数,这样可以使得答案最大。那么,答案就是 \(\Sigma_{i = 1}^{n}|a_i| - 2 \times min(|a_i|)\) ,为啥是 \(2 \times min(|a_i|)\) 呢?因为我们求 \(\Sigma_{i = 1}^{n}|a_i|\) 时,多加了一个 \(min(|a_i|)\),所以要多减去一个。
- 如果负数的个数为偶数:那么我们可以让所有的数都是正数,直接输出所有元素的绝对值之和即可。
时间复杂度:\(O(n)\)
1 | void solve() { |
F. Range Update Point Query
思路:
- 我是直接用线段树写的,这题涉及到区间修改和单点查询,可以直接用线段树做,每个节点记得开一个
bool
标记,如果 \(\le 10\) 就不能在进行修改了。
时间复杂度:\(O(n + q \times logn)\)
1 | constexpr int N = 2E5 + 10; |
G1. Teleporters (Easy Version)
思路:
- 直接存一下从起点 \(0\) 到其他位置的花费,然后从小到大排序,直到用完所有的硬币。
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
G2. Teleporters (Hard Version)
思路:
时间复杂度: