Codeforces Round 799 (Div. 4)
A. Marathon
思路:
- 模拟即可
时间复杂度:\(O(1)\)
1 | void solve() { |
B. All Distinct
思路:
- 要保证最后的序列个数都是唯一的,所以我们可以一开始把所有数量多于
2
的数字都删的只剩2
,然后根据最后个数为2
的个数的奇偶性判断即可
时间复杂度:\(O(n)\)
1 | void solve() { |
C. Where's the Bishop?
思路:
- 直接找
g[i + 1][j + 1]
和g[i + 1][j - 1]
和g[i - 1][j + 1]
是否为#
即可
时间复杂度:\(O(64)\)
1 | void solve() { |
D. The Clock
思路:
- 按照规则模拟即可
时间复杂度:\(O(n)\)
1 | void solve() { |
E. Binary Deque
思路:
- 因为每次是删除头部和尾部,所以我们用一个前缀和维护区间
1
的个数,然后二分右端点,然后进行取min
进行找最小值即可
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
F. 3SUM
思路:
- 由于需要保证三个数的和的最后一位是
3
,可以发现,这个只和每个数的个位有关,所以,我们只需要把每一个数按照个位数字存在一起,然后枚举最后一位数字是多少即可,这样时间复杂度为 \(O(n + 9^3)\)
时间复杂度:\(O(n)\)
1 | void solve() { |
G. 2^Sort
思路:
- 要使整个序列是严格递增,因为一个区间是按位每次多乘以
2
,所以它满足单调性,我们可以进行双指针扫描 - 只要在这个区间里,\(a_{pre} < a_{i} \times 2\),就继续扫描
时间复杂度:\(O(n)\)
1 | void solve() { |
H. Gambling
思路:
- 因为题目要表明,当我们猜中一次,就可以使得本金 \(\times 2\),所以,我们要求的就是一个众数减去非众数值最大的区间
- 我们要求一个区间内的众数的数量减去非众数的数量最大
时间复杂度:\(O(nlogn)\)
解法一:map 维护每个元素的下标
1 | void solve() { |
解法二:线段树 进行动态区间修改
1 | constexpr int N = 2E5 + 10; |