前言
感觉自从没了 \(\tt{EX}\) 后整体难度降了不少
A
模拟即可
B
观察到 \(n\le 100\),枚举答案验证即可,时间复杂度 \(O(100 \times n \log n)\)
C
手算一下可以发现满足条件的数字只有 \(1022\) 个,直接 \(\tt{dfs}\) 出所有答案并存储,排序并输出第 \(k\) 小即可
D
易得求 \(\sum_{i=1}^{n} \sum_{j=1}^{m} \min(a_i + b_j,P)\)。
显然排序不影响答案,所以考虑对 \(a\) 和 \(b\) 排序后对 \(b\) 做前缀和并二分查找 \(b\) 中第一个大于等于 \(P-a_i\) 的数的位置,通过前缀和计算答案即可,时间复杂度 \(O(n \log m)\)。
E
发现建出来的树是一颗完全二叉树,考虑将答案分为两部分,即点自身的 \(k\) 儿子和与该点的父亲距离为 \(k\) 的点。
可是这两个部分存在交集,所以我们每次加上父亲结点的贡献时都要再减去点自身的 \(k-2\) 儿子。大眼观察得该完全二叉树的每一层的点都可以构成一个公差为 \(1\) 的等差数列,那么计算一个点的 \(d\) 儿子时(\(1 \le d \le k\)),可以找到 \(d\) 儿子中最左的结点 \(u\) 和最右的结点 \(v\),\(d\) 儿子的数量即为 \(v-u+1\)。
注意当 \(k\) 大于两倍树高时无解,因为树的直径不可能超过两倍树高。时间复杂度 \(O(n \log n \log n)\)。
F
可撤销背包板子,虽然我之前不知道有可撤销背包这么个东西
设 \(dp_i\) 为和为 \(i\) 的方案数,对于增加一个 \(x\),多出的方案数就是从 \(i-x\) 转移而来;对于减少一个 \(x\),\(i\) (\(x \le i\)) 在没有 \(x\) 之前的方案就是从 \(i-x\) 处没有使用的位置转移而来。
时间复杂度 \(O((k-x)^2)\)。