1 条题解
-
0
题意分析
- 树结构:无限满二叉搜索树,节点编号按层序递增(左子节点为,右子节点为)。
- 查询目标:对于给定的,找到其子树中的最小编号(最左叶子节点)和最大编号(最右叶子节点)。
解题思路
- 最小编号:从出发,不断向左子树(即)递归,直到无法继续(最后一层的左叶子节点)。最小编号为的最左路径终点,即的某个函数。
- 最大编号:从出发,不断向右子树(即)递归,直到无法继续。最大编号为的最右路径终点,其值为的若干次迭代后结果。
- 数学推导:
- 最小编号:设的二进制表示为最高位的位置为,则最小编号为。
- 最大编号:最大编号为的等比数列求和结果,或通过位运算直接计算。
实现步骤
- 输入处理:读取和每个查询的。
- 计算最小编号:找到的二进制最高位,最小值为。
- 计算最大编号:通过公式或迭代右子树得到。
- 输出结果:按格式输出每对最小和最大值。
代码实现
#include <iostream> using namespace std; int n; long long tmp; long long lowbit(long long x) { return (-x) & x; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> tmp; cout << tmp - lowbit(tmp) + 1 << " " << tmp + lowbit(tmp) - 1 << endl; } return 0; }
- 1
信息
- ID
- 1310
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者