思路:
因为小球落下后,开关的状态就会改变,所以一个节点上的小球的去向,跟这个小球是第几个到达此节点
有关系,也就是说,如果到达时是第奇数个,往左走,偶数个,就要往右走;
比如,如果是节点1,那么我们可以知道,第一个小球(I=1)肯定是往左走,第二个小球(I=2)则是往右走;
也就是球到达的编号为奇数,则往左走,偶数往右走;
那么如果是节点2呢,如果把节点2看成节点1,其实也有规律;
比如第5颗球,他是第五个到达节点1的球,接下来往左,第5/2+1=3(奇)个到达节点2的球,
接下来往左,3/2+1=2(偶),第2个到达节点4,下面第2/2=1个到达节点9;
说来说去就是,球到达每个节点的编号决定了它下一步的方向,于是,我们只需要模拟最后一颗球,
就可以得到结果。
还要注意,二叉树的结构是

所以节点编号计算是往左k*2,往右k*2+1。
1 #include<cstdio>
2 int main() {
3 int T, D, I;
4 scanf("%d", &T);
5 while (T--)
6 {
7 scanf("%d%d", &D, &I);
8 int k = 1;//k是当前节点的编号
9 for (int i = 0; i < D - 1; i++)
10 {
11 if (I % 2) //奇数,是往左走的,第(I + 1) / 2个小球
12 {
13 k = k * 2;
14 I = (I + 1) / 2;
15 }
16 else //偶数,往右,第I/2个
17 {
18 k = k * 2 + 1;
19 I /= 2;
20 }
21 }
22 printf("%d\n", k);
23 }
24 return 0;
25 }