Codeforces Round 925 (Div. 3)
A. Recovering a Small String
思路:
- 直接暴力枚举
时间复杂度:\(O(26^3)\)
1 | void solve() { |
B. Make Equal
思路:
- 判断在过程中是否会出现差值累加小于
0
的情况
时间复杂度:\(O(n)\)
1 | void solve() { |
C. Make Equal Again
思路:
- 由于最多只能修改一次,那么最终的序列每个元素的值一定只可能等于
a[0]
或者a[n-1]
,只需取最小数
时间复杂度:\(O(1)\)
1 | void solve() { |
D. Divisible Pairs
思路:
- 用 \(map\) 维护这个两个式子 \(B= \begin{cases} (a_i+a_j) \% x \\ (a_i-a_j) \% y \end{cases}\) 的值
时间复杂度:\(O(n)\)
1 | void solve() { |
E. Anna and the Valentine's Day Gift
思路:
Anna
可以让一个数的0
数量变少,如1580 => 851
,相反,Sasha
需要保护0
尽可能多所以我们可以开一个数组用来存每个数的末尾
0
的个数,然后将其从大到小排序,这样可以保证二人是按最优的方案进行游戏的然后只需判断最后的所有数的位数是否大于等于
m
即可
时间复杂度:\(O(nlogn)\)
1 | void solve() { |
F. Chat Screenshots
思路:
- 用拓扑排序找出是否存在环即可
- 如果
cnt
为n
就说明这个拓扑序是确定的,否则就说明有环,那么一定小于n
时间复杂度:\(O(n+m)\)
1 | void solve() { |
G. One-Dimensional Puzzle
思路:
- \(1\) 和 \(2\) 是可以一直拼接的,\(3\) 和 \(4\) 是作为 \(1\) 和 \(2\) 的辅助,如果出现 \(1\) 和 \(2\) 的差值超过 \(2\),那么一定不存在可行方案
- 所以我们可以用隔板法,来得到方案数,
- 当二者不相等时:\(C_{c+mx-1}^{mx-1} + C_{d+mx-1}^{mx-1}\)
- 当二者相等且不为 \(0\) 时:\(C_{c+a-1}^{a-1} + C_{d+a-1}^{a-1} + C_{c+a}^{a} + C_{d+a}^{a}\)
- 当二者相等且为 \(0\) 时:由于 \(3\) 和 \(4\) 并不可兼容,所以只存在 \(1\) 种情况
- 线性逆元:\(i^{-1}=-\lfloor \frac{mod}{i} \rfloor \times (mod \% i)^{-1} \Rightarrow inv[i]=(P - P / i) \times inv[P \% i] \space \% \space P\)
时间复杂度:\(O(n)\)
1 | constexpr int P = 998244353; |