uva679 Dropping Balls

A number ofKballs are dropped one by one from the root of a fully binary tree structure FBT. Eachtime the ball being dropped first visits a non-terminal node. It then keeps moving down, either followsthe path of the left subtree, or follows the path of the right subtree, until it stops at one of the leafnodes of FBT. To determine a ball’s moving direction a flag is set up in every non-terminal node withtwo values, eitherfalseortrue. Initially, all of the flags arefalse. When visiting a non-terminal nodeif the flag’s current value at this node isfalse, then the ball will first switch this flag’s value, i.e., fromthefalseto thetrue, and then follow the left subtree of this node to keep moving down. Otherwise,it will also switch this flag’s value, i.e., from thetrueto thefalse, but will follow the right subtree ofthis node to keep moving down. Furthermore, all nodes of FBT are sequentially numbered, starting at1 with nodes on depth 1, and then those on depth 2, and so on. Nodes on any depth are numberedfrom left to right.

For example, Fig. 1 represents a fully binary tree of maximum depth 4 with the node numbers 1,2, 3, ..., 15. Since all of the flags are initially set to befalse, the first ball being dropped will switchflag’s values at node 1, node 2, and node 4 before it finally stops at position 8. The second ball beingdropped will switch flag’s values at node 1, node 3, and node 6, and stop at position 12. Obviously,the third ball being dropped will switch flag’s values at node 1, node 2, and node 5 before it stops atposition 10.


Fig. 1: An example of FBT with the maximum depth 4 and sequential node numbers.

Now consider a number of test cases where two values will be given for each test. The first value isD, the maximum depth of FBT, and the second one is I, theI-th ball being dropped. You may assumethe value ofIwill not exceed the total number of leaf nodes for the given FBT.

Please write a program to determine the stop positionPfor each test case.For each test cases the range of two parametersDandIis as below:


Input

Containsl+ 2lines.

2D20,and1I524288.

Line 1lthe number of test cases
Line 2 
D1I1test case #1, two decimal numbers that are separated by one blank...
Line 
k+1DkIktest case #k
Linel+1DlIltest case #l
Linel+ 2-1a constant ‘-1’ representing the end of the input file

Output

Containsllines.

Line 1...Linek...Linel

the stop positionPfor the test case #1the stop positionPfor the test case #kthe stop position Pfor the test case #l

Sample Input

5

4 2

3 4

10 1

2 2

8 128

-1

Sample Output

12

7

512

3

255 


 #include <bits/stdc++.h>



using namespace std;


int main()
{
int nCase;
while(scanf("%d", &nCase) && nCase!=-1)
{
while(nCase--)
{
int D,I;
cin>>D>>I;
int k =1;
for(int i=0; i < D-1; i++)
{
if(I%2){k *= 2; I = (I+1)/2;}
else {k = k*2+1; I /=2;}


k = (k<<1)+1-(I%2);
  I=(I>>1)+(I%2);
}
cout<<k<<"\n";
}
}
return 0;
}
posted @ 2017-02-23 15:48  legolas007  阅读(26)  评论(0编辑  收藏  举报