第 89 场双周赛复盘
第 89 场双周赛复盘
最后一题尚未解决
二的幂数组中查询范围内的乘积
关键在于:求出power数组,power数组存放一个数的二进制分解结果
1 | int ind=0; |
最小化数组中的最大值
最小化最大值 —> 二分答案
二分答案的模板
1 | while(l<=r){ |
1 | class Solution { |
类似的题
2440. 创建价值相同的连通块
有点难,先放一下
关键:学会统计子树的大小/统计子树的点权和
思路:
- 首先一个明显的性质,s=sum(nums),如果要把树分成权值和相同的x个连通块,那么s能整除x。
- 那么考虑枚举每个连通块的权值和i,如果能整除,那么尝试分成s//i块,删除的边数就是s//i - 1 【因为题目给出的是一棵树】。
- 问题就是如何尝试分成s//i块,且每块权值和是i。
- 那么按照灵神给出的
计算子树权值和模板,我们试图让每个子树的价值是i。 - 显然,如果子树和超过i,不合法,可以提前返回,我们用-1标志它不合法。
- 如果子树和正好是i,那么剪掉这颗子树即可,返回0。
- 最后检查根节点所在的连通块是0即可。
如果一颗子树的价值等于target,那么可以将其作为一个连通块,和其父节点断开,换句话说,它对其祖先节点的价值贡献是0。
DFS这棵树,统计子树的价值:
如果价值超过target,那么当前删边方案不合法,返回 −1。
如果价值等于target,找到了一个连通块,和其父节点断开,返回 0。
如果价值小于target,尚未找到一个完整的连通块,返回价值。
如果 DFS 完了没有返回−1,则当前删边方案合法。如果从大到小枚举连通块的个数,则此时可以直接返回答案。
1 | private int dfs(int x, int fa) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小沙同学个人博客!

