这道题如果模拟着来写,思路很简单

 #include <iostream>
 #include <cstring>
 using namespace std;
 int  T,D,I,cur;
 <<;
 int vis[maxn];
 int main()
 {
     int  T;
     while(cin>>T)
     {
         )
             break;
         while(T--)
         {
             while(cin>>D>>I)
             {
                 memset(vis,,sizeof(vis));
                 ;i<I;i++)
                 {
                     cur=;
                     <<D)
                     {
                         )
                         {
                             vis[cur]=;
                             cur=cur*;
                         }
                         )
                         {
                             vis[cur]=;
                             cur=cur*+;
                         }
                     }

                 }
                 cout<<cur/<<endl;
             }
         }
     }

     ;
 }

但是TLE了。

然后其实他的思路是,落在 某一点 的 第I个小球 要进入下一层的两个子结点时,当I为奇数时,它是落在左节点的,当I为偶数时,它是落在右节点的。

每一层都一样只要做D-1次就够了。所以是

 #include <iostream>
 #include <cstring>
 using namespace std;
 int  T,D,I,cur;
 int main()
 {
     while(cin>>T)
     {
         )
             break;
         while(T--)
         {
             cin>>D>>I;
             ;
             ;i<D-;i++)
             {
                 )
                 {
                     I=(I+)/;
                     k=k*;
                 }
                 else
                 {
                     I=I/;
                     k=k*+;

                 }
             }
             cout<<k<<endl;
         }
     }
     ;
 }
04-30 05:00