牛客周赛 Round 30
A. 小红的删字符
思路:
- 删除中间的那个字符即可
时间复杂度:
1 | signed main() { |
B. 小红的正整数
思路:
- 找到除
0
以外,最小的字符出现的位置,然后将其他字符排序接在最小的字符后面
时间复杂度:
1 | signed main() { |
C. 小红构造回文
思路:
- 分奇偶情况,然后从中间开始双指针扫描,出现不一致的相邻两个字符直接交换位置然后输出字符串,否则一定无解
时间复杂度:
1 | signed main() { |
D. 小红整数操作
思路:
- 可以将
x
和y
分别除gcd(x, y)
,这样等于一次性把操作2
做完,然后我们分别求a
的最大范围,分别求a
的上界和下界
时间复杂度:
1 | signed main() { |
E. 小红树上染色
思路:
树形
,我们维护两个状态:染色和不染色的方案数 - 对于叶子节点,有两种方案:染色或不染色。
- 对于非叶子节点,我们考虑染色和不染色两种情况:
- 如果当前节点染色了,那么其子节点必须不染色,因此染色方案数等于子节点不染色的方案数的乘积。
- 如果当前节点不染色,那么其子节点可以染色也可以不染色,因此不染色方案数等于子节点染色和不染色方案数之和。
我们用
表示不染色, 表示染色,那么状态转移方程为:
时间复杂度:
1 | constexpr int P = 1E9 + 7; |