1 条题解

  • 0

    题意分析

    1. 树结构:无限满二叉搜索树,节点编号按层序递增(左子节点为2X2X,右子节点为2X+12X+1)。
    2. 查询目标:对于给定的XX,找到其子树中的最小编号(最左叶子节点)和最大编号(最右叶子节点)。

    解题思路

    1. 最小编号:从XX出发,不断向左子树(即2X2X)递归,直到无法继续(最后一层的左叶子节点)。最小编号为XX最左路径终点,即2深度2^{\text{深度}}的某个函数。
    2. 最大编号:从XX出发,不断向右子树(即2X+12X+1)递归,直到无法继续。最大编号为XX最右路径终点,其值为2X+12X+1的若干次迭代后结果。
    3. 数学推导
      • 最小编号:设XX的二进制表示为最高位11的位置为kk,则最小编号为2log2X2^{\lfloor \log_2 X \rfloor}
      • 最大编号:最大编号为2X+12X + 1的等比数列求和结果,或通过位运算直接计算。

    实现步骤

    1. 输入处理:读取NN和每个查询的XX
    2. 计算最小编号:找到XX的二进制最高位kk,最小值为2k2^k
    3. 计算最大编号:通过公式2深度+112^{\text{深度}+1} - 1或迭代右子树得到。
    4. 输出结果:按格式输出每对最小和最大值。

    代码实现

    #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
    上传者