Codeforces Round 835 (Div. 4)
A. Medium Number
思路:
- 将三个数排序后,中间的那个输出即可
时间复杂度:\(O(1)\)
1 | void solve() { |
B. Atilla's Favorite Problem
思路:
- 答案为 \(\Sigma_{i=0}^{n-1}max(s_i - 'a' + 1, ans)\)
时间复杂度:\(O(n)\)
1 | void solve() { |
C. Advantage
思路:
- 答案的序列为:当前值与除去当前值的最大值的差值
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
D. Challenging Valleys
思路:
- 只能存在山谷,不能是山峰,所以我们只需要找到那个最低点,然后判断 \(0 \sim pos_{min}\) 是不是递减,\(pos_{min} \sim n\) 是不是递增即可
时间复杂度:\(O(n)\)
1 | void solve() { |
E. Binary Inversions
题目大意:对于所有的 \((1 \le i \lt j \le n)\),如果第 \(i\) 个位置是 \(a_i\),第 \(j\) 个位置是 \(a_j\),并且 \(a_i \gt a_j\),就表示一个反转数
思路:
- 要让反转数尽可能的多,那么我们就需要预处理一个前缀和,表示:
- \(zero[i]\):前 \(i\) 个位置有多少个 \(0\)。
- \(one[i]\):前 \(i\) 个位置有多少个 \(1\)。
- 然后对于我们反转第 \(i\)
个位置,有两种情况:
- 如果第 \(i\) 位最初是 \(0\),那么我们将这个位置转换后的贡献是 \(zero[n]-zero[i]-one[i]\)
- 如果第 \(i\) 位最初是 \(1\),那么我们将这个位置转换后的贡献是 \(one[i-1]-(zero[n]-zero[i])\)
时间复杂度:\(O(n)\)
1 | void solve() { |
F. Quests
思路:
- 首先,判断 \(Infinity\) 和 \(Imposible\),如果收益最大的那个任务 \(d\) 次还不能达到目标要求,那么一定不可能
- 如果把序列里的前 \(min(n, d)\) 求和大于目标要求 \(c\),那么说明 \(k\) 可以任意大
- 然后对于有解的情况,我们二分这个 \(k\) 值,对于这个任务周期为 \(k+1\),完整周期有 \(\lfloor \frac{d}{k + 1} \rfloor\) 次,最后剩余的一个周期,取前 \(d \% (k + 1) - 1\) 个,这样保证 \(k\) 的最大值。
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
G. SlavicG's Favorite Problem
思路:
- 可以传送 \(1\) 次,所以,我们从起点开始 \(dfs\),然后记录路径中的每个点的值,然后从终点向起点再 \(dfs\),当找到一个相同的值,就说明这个位置是可以传送过来的,所以我们只需要进行一次双向 \(dfs\) 即可。
时间复杂度:\(O(n)\)
1 | void solve() { |