最大二进制奇数
模拟。
1 | class Solution { |
美丽塔 I
同下。
美丽塔 II
枚举以每个位置作为山顶,可以得到的最大高度和。通过使用单调栈 + 前后缀分解,可以 \(O(n)\) 的时间算出答案。
1 | class Solution { |
统计树中的合法路径数目
树型 DP,对于每个节点,计算以该节点为根的子树中,经过该节点的有效路径数,我们只需要维护子树中不包含质数的路径数和只包含一个质数的路径数。
1 | class Solution { |
模拟。
1 | class Solution { |
同下。
枚举以每个位置作为山顶,可以得到的最大高度和。通过使用单调栈 + 前后缀分解,可以 \(O(n)\) 的时间算出答案。
1 | class Solution { |
树型 DP,对于每个节点,计算以该节点为根的子树中,经过该节点的有效路径数,我们只需要维护子树中不包含质数的路径数和只包含一个质数的路径数。
1 | class Solution { |
模拟。
1 | public static void solve() { |
比赛时是暴力做的,赛后这个 \(O(1)\) 还想了半天。不多解释,代码还是比较好理解的。
1 | public static void solve() { |
原来是使用十个二进制位来表示对应数字是否存在,通过暴力枚举算出所有可能的数,最后排序获取对应的位置即可,真的没想到。
1 | public static void solve() { |
二分,状态真差,把加法和乘法混淆了。
1 | public static void solve() { |
模拟。
1 | class Solution { |
比赛时又写复杂了,当时是想到所有相同的数都必须同时选,所以加了一层循环来跳过相同的数。但是相同的数天然的不满足判断条件,所以不需要这样写。这题唯一需要注意的就是特判全都不选的情况,以及全都选的情况必定满足,可以直接加到答案里(以减少判断代码)。
1 | class Solution { |
比赛时又又写复杂了,当时是把所有的库存都清除了再二分的,其实可以直接二分!!
1 | class Solution { |
注意题目的描述是每对元素的乘积都是完全平方数。朴素的想法就是对下标进行质因数分解,将所有出现次数为奇数质因数相乘,其结果作为桶的下标,把所有同类的数放在同一个桶里面,然后对每个桶求和取最大值,这样的时间复杂度是 \(O(n\sqrt{n})\)。但是有 \(O(n)\) 的解法,如下所示。
1 | class Solution { |