山東省第五屆ACM大學生程式設計競賽-Full Binary Tree(二叉樹&&求任意兩節點路徑)
Full Binary Tree
Time Limit: 2000ms Memory limit: 65536K 有疑問?點這裡^_^
題目描述
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.
輸入
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.
輸出
For each query, print the required answer in one line.
示例輸入
5 1 2 2 3 4 3 1024 2048 3214567 9998877
示例輸出
1 2 3 1 44
提示
來源
2014年山東省第五屆ACM大學生程式設計競賽
題目意思:
有一棵滿二叉樹,形狀如圖:
根節點為1,節點數值最大不超過10e9。
求任意兩個節點a和b之間的最短路徑。
解題思路:
①求出較小節點所在的層數;
②使較大節點向上跳到較小節點所在的層數,每跳一次路徑加1;
③此時兩節點在同一層,同時向上跳直到a=b,每個節點每跳一次路徑加1,則兩節點一起跳路徑加2;
④此時得到的路徑長度就是a和b之間的最短路徑。
AC程式碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int p[31];//2^30>N
const long long N=1000000010;
void f()
{
int i;
for(i=0; pow(2,i)<=N; ++i)
p[i]=pow(2,i);//p[]儲存2^i
}
int main()
{
int t;
f();
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);//令a始終小於等於b
int ans=0;
int pos;//較小的數a的層數為pos
for(int i=0; i<31; i++)
if(a>=p[i]&&a<p[i+1])
{
pos=i;
break;
}
while(1)//改變b的層數使a和b在同一層上
{
if(b>=p[pos]&&b<p[pos+1])
break;
b/=2;
ans++;//每跳一層路徑加一
}
while(a!=b)//兩個節點一起跳
{
a/=2;
b/=2;
ans+=2;//每個節點跳一次路徑加1,兩個節點同時跳就是加2
}
printf("%d\n",ans);
}
return 0;
}
相關文章
- 第八屆山東省ACM大學生程式設計競賽總結ACM程式設計
- 山東省第七屆ACM大學生程式設計競賽-Reversed WordsACM程式設計
- 山東省第一屆ACM大學生程式設計競賽-Balloons(搜尋)ACM程式設計
- 山東省第六屆ACM大學生程式設計競賽-Square Number(完全平方數)ACM程式設計
- 山東省第六屆ACM大學生程式設計競賽-Lowest Unique Price(桶排序)ACM程式設計排序
- 山東省第四屆ACM大學生程式設計競賽-Rescue The Princess(計算幾何)ACM程式設計
- 山東省第四屆ACM大學生程式設計競賽-Contest Print Server(模擬)ACM程式設計Server
- 山東省第六屆ACM大學生程式設計競賽-Single Round Math(大數除法)ACM程式設計
- 2012年"浪潮杯"山東省第三屆ACM大學生程式設計競賽(熱身賽)ACM程式設計
- 山東省第四屆ACM大學生程式設計競賽-Boring Counting(劃分樹-二分查詢)ACM程式設計
- 山東省第四屆ACM大學生程式設計競賽-Alice and Bob(二進位制&&找規律)ACM程式設計
- 第十屆山東省大學生程式設計競賽題解(A、F、M、C)程式設計
- 山東省第五屆ACM大學生程式設計競賽-Hearthstone II(組合數學-第二類Stirling數)ACM程式設計
- 山東省第八屆 ACM 省賽 quadratic equation (水、坑)ACM
- 第15屆浙江省大學生程式設計競賽D題程式設計
- 山東省第四屆acm解題報告(部分)ACM
- 我校學子在山東省ACM競賽中獲得優異成績ACM
- 2024 CCPC第五屆遼寧省程式設計競賽 集訓2程式設計
- 湖南省大學生程式設計競賽系統設計程式設計
- 2019山東ACM省賽補題題解ACM
- 24山東省賽wp
- 第二十屆西南科技大學ACM程式設計競賽(同步賽)ACM程式設計
- 2020 年第一屆遼寧省大學生程式設計競賽 D.開心消消樂(點分治)程式設計
- 257. Binary Tree Paths(列印二叉樹所有路徑)二叉樹
- [題解][2021-2022年度國際大學生程式設計競賽第10屆陝西省程式設計競賽] Type The Strings程式設計
- 九州信泰杯 第十一屆山東省網路安全技能大賽
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- Java二叉樹排序及任意兩點個節點間的最大距離Java二叉樹排序
- 第 10 屆 CCPC 中國大學生程式設計競賽濟南站 遊記程式設計
- 無錫學院2024年ACM大學生程式設計競賽校選賽 題解ACM程式設計
- 紹興市大學生程式設計競賽程式設計
- [補題] 第 45 屆國際大學生程式設計競賽(ICPC)亞洲區域賽(上海)程式設計
- 二叉樹兩個節點的公共節點二叉樹
- 2014年藍橋杯程式設計大賽山東省賽區成績公佈程式設計
- 【vue】在二叉樹中根據子節點找出父節點路徑Vue二叉樹
- [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉樹的最小共同父節點二叉樹
- 第43屆ACM-ICPC國際大學生程式設計競賽 亞洲區域賽南京站現場賽名額分配相關說明ACM程式設計
- Maximum Depth of Binary Tree 二叉樹的深度二叉樹