1 条题解

  • 0
    @ 2026-4-27 19:15:06

    这道题目十分的简单,主要思路如下:

    T1:

    读懂题目。文中说当“如果这个节点是FALSE,则这个球把它变成TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为FALSE,而接下来从右子树走”,意为每个节点第偶数次访问会往左走(权值乘2),第奇数次回往右走(权值乘2+1)

    T2

    寻找规律。这道题就是一个根据二叉树性质判断该怎么走的问题。T1说了,往左走就是乘2,往右走就是乘2+1。而我们要理清楚的其实是第K次走到这个非叶子节点的时候,是第几次走到左子树(或右子树)的根节点。这个问题看起来十分困难,但仔细分析便会得到:第一次走到这个节点,就是第一次走到左子树根节点,第二次走到这个节点就是第一次走到右子树根节点,第三次走到这个节点也就是第二次走到左子树根节点......

    T3

    整理公式。通过T2的铺垫,我们可以对第K个节点之后小球的走势进行推算(M表示访问K节点的次数):

    k乘2+1=>M/2
    k乘2=>(M+1)/2//说一下理由:若m为奇数,其实是M/2+1,若为偶数,则就是M/2。但(M+1)/2则间距2者性质,就采用了
    

    T4

    直接敲出代码AC

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,a[100100],s=1;
    signed main(){
    	cin>>n>>m;
    	for(int i=2;i<=n;i++){//本来再第一层,要走到叶子节点就走(n-1)层。
    		if(m%2==0){
    			s=s*2+1;
    			m=m/2;
    		}
    		else {
    			s*=2;
    			m=(m+1)/2;
    		}
    	}
    	cout<<s;
    	return 0;
    }
    
    • 1

    信息

    ID
    861
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    55
    已通过
    17
    上传者