这道题如果模拟着来写,思路很简单
#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; } } ; }