SDUT 2882 Full Binary Tree【思维】

探讨无限全二叉树中两点间最短路径长度的计算方法,通过递归求解最近公共祖先来减少距离计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Full Binary Tree

Time Limit: 2000MS  Memory Limit: 65536KB
Problem Description
In computer science, a binary tree is a tree data structure in which each node has at most two children. Consider an infinite full binary tree (each node has two children except the leaf nodes) defined as follows. For a node labelled v its left child will be labelled 2 * v and its right child will be labelled 2 * v + 1. The root is labelled as 1.
 
You are given n queries of the form i, j. For each query, you have to print the length of the shortest path between node labelled i and node labelled j.
 
Input
First line contains n(1 ≤ n ≤ 10^5), the number of queries. Each query consists of two space separated integers i and j(1 ≤ i, j ≤ 10^9) in one line.
 
Output
For each query, print the required answer in one line.
 
Example Input
5
1 2
2 3
4 3
1024 2048
3214567 9998877
Example Output
1
2
3
1
44
Hint
 
Author
2014年山东省第五届ACM大学生程序设计竞赛
题目大意:

二叉树遍历作为编号,问两个点之间的最短路。


思路:


ans=dist(1,i)+dist(1,j)-2*dist(1,Lca[i,j])

找父亲节点的过程不断/2即可。



Ac代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL ;
const LL MOD = 1000000000+7;

#define abs(x)  (((x)>0)?(x):-(x))

/***************************************/
int path[500];
int path2[500];
int main(){
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,j;
        scanf("%d%d",&i,&j);
        int dist1=0;
        int dist2=0;
        while(i>1)
        {
            path[dist1]=i;
            i/=2;
            dist1++;
        }
        while(j>1)
        {
            path2[dist2]=j;
            j/=2;
            dist2++;
        }
        int flag=0;
        int pos=-1;
        for(int i=0;i<dist1;i++)
        {
            for(int j=0;j<dist2;j++)
            {
                if(path[i]==path2[j])
                {
                    pos=path[i];
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
        }
        int dist3=0;
        while(pos>1)
        {
            pos/=2;
            dist3++;
        }
        printf("%d\n",dist1+dist2-2*dist3);
    }
}








### SDUT PTA 编程题解与在线评测系统使用说明 #### 关于SDUT PTA在线评测系统的概述 SDUT PTA(Programming Teaching Assistant)是一个面向学生学习编程的在线评测平台,主要用于支持山东理工大学计算机科学及相关专业的课程教学。该平台提供了丰富的练习题目以及自动化的测试机制,帮助学生巩固所学的知识并提升实际编程能力[^1]。 #### 如何使用SDUT PTA在线评测系统? 以下是关于如何有效利用SDUT PTA进行编程训练的关键要点: 1. **注册账号** 学生需通过学校指定的方式完成账户注册,并登录到对应的班级页面参与作业提交和考试活动。 2. **熟悉界面布局** 登录后可以看到左侧导航栏包含了“我的作业”、“公开试题”等功能模块;右侧则显示具体任务列表及其状态信息(未做/已交/得分情况)。点击某道题目可以查看其详细描述、样例输入输出以及其他提示内容[^2]。 3. **编写代码并调试** 对于像“计算1到n的和”的简单问题,可以直接采用如下C语言实现方式来解决: ```c #include<stdio.h> int main(){ int n, sum=0; scanf("%d",&n); for(int i=1;i<=n;i++) { sum +=i; } printf("%d\n",sum); return 0; } ``` 此段代码实现了基本的功能需求——读取用户输入的一个正整数值`n`,并通过循环累加得到最终的结果输出。 4. **提交解决方案** 完成本地开发环境中的编码工作之后,在网页端找到对应位置上传源文件或者直接粘贴文本框内的代码片段即可发起评测请求。注意遵循每道题目的特殊约束条件比如时间复杂度限制等规定。 5. **分析反馈结果** 提交完成后会迅速获得运行状况报告,如果存在错误,则应仔细阅读报错消息重新审视自己的逻辑是否存在漏洞再尝试修正直至完全正确为止。 #### 常见问题解答 对于初学者来说可能会遇到一些困惑之处,下面列举几个典型场景供参考: - 如果发现即使按照标准答案复制也得不到满分怎么办?可能是因为忽略了某些边界情形处理或者是格式化方面的小失误所致。 - 当面对较复杂的算法类挑战不知道从哪里下手时建议先梳理清楚思路画流程图辅助理解后再动手实践。 - 还有就是保持耐心多试几次不要轻易放弃因为每一次失败都是成长的机会! ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值