CF507C 给定一种二叉树的走法,问到第n个叶子结点之前,有多少个结点被走过

CF507C 给定一种二叉树的走法,问到第n个叶子结点之前,有多少个结点被走过_第1张图片

CF507C 给定一种二叉树的走法,问到第n个叶子结点之前,有多少个结点被走过_第2张图片这题属于没想法题。

#include<bits/stdc++.h> 
#define ll long long
using namespace std;
int main(){
    ll h,n;
    cin>>h>>n;
    ll l=0,r=pow(2,h); //或者写成(1ll<<h),ll一定要加!! 
    int p=0; //表示初始往左走,1表示往右走 
    ll s=0;
    while(h){
    	ll mid=(l+r)/2; //当前范围的中点 
    	if((n>mid&&p==0)||(n<=mid&&p==1)){ //与题设走法冲突,所以要多走半边子树使方向同步 
			s+=pow(2,h)-1;
		} 
		else
			p=1-p;  //默认更换方向,但上面的if特殊,它变换了方向 
		s++;
		if(p==0)  
			l=mid;  //更新范围 
		else
			r=mid;
    	h--;
    }
    cout<<s<<endl;
    return 0;
}



你可能感兴趣的:(CF507C 给定一种二叉树的走法,问到第n个叶子结点之前,有多少个结点被走过)