1 条题解
-
0
这道题目十分的简单,主要思路如下:
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
- 上传者