#include <iostream>
#include <stdio.h>
using namespace std;
int node[10050000]= {0};
void createFBTanswer(int n, int value,int d,int D,int tolerance)
{
if(d> D)
{
return ;
}
else
{
node[n] = value+tolerance;
tolerance = 1<<d-1;
value = node[n];
d++;
createFBTanswer(n*2,value,d,D,0);
createFBTanswer(n*2+1,value,d,D,tolerance);
}
}
int getPosition(int I,int D)
{
int n = 1<<D-1;
for(int i=0;i<n;i++)
{
if(node[n+i]==I)
{
return n+i;
}
}
return 0;
}
int main() {
int D,l,I;
cin>>l;
int di[l][2];
int maxD=0;
int i=0;
for(i=0;i<l;i++)
{
cin>>di[i][0]>>di[i][1];
if(di[i][0]==-1)
{
break;
}
if(di[i][0]>maxD)
{
maxD = di[i][0];
}
}
getchar();
getchar();
createFBTanswer(1,1,1,maxD+1,0);
for(i=0;i<l;i++)
{
cout<<getPosition(di[i][1],di[i][0])<<endl;
}
return 0;
}
查找代码还可以优化一下,UVa不显示运行时间,也不知道优化了多少。
用 两个 getchar(); 完全是 弄掉 -1 的输入啊 ! 哈哈。。。
#include <iostream>
#include <stdio.h>
using namespace std;
int node[10050000]= {0};
void createFBTanswer(int n, int value,int d,int D,int tolerance)
{
if(d> D)
{
return ;
}
else
{
node[n] = value+tolerance;
tolerance = 1<<d-1;
value = node[n];
d++;
createFBTanswer(n*2,value,d,D,0);
createFBTanswer(n*2+1,value,d,D,tolerance);
}
}
int getPosition(int I,int D)
{
int n = 1<<D-1;
/*for(int i=0;i<n;i++)
{
if(node[n+i]==I)
{
return n+i;
}
}*/
if(I%2==1)
{
for(int i=0;i<n/2;i++)
{
if(node[n+i]==I)
{
return n+i;
}
}
}
else
{
for(int i=n/2;i<n;i++)
{
if(node[n+i]==I)
{
return n+i;
}
}
}
return 0;
}
int main() {
int D,l,I;
cin>>l;
int di[l][2];
int maxD=0;
int i=0;
for(i=0;i<l;i++)
{
cin>>di[i][0]>>di[i][1];
if(di[i][0]==-1)
{
break;
}
if(di[i][0]>maxD)
{
maxD = di[i][0];
}
}
getchar();
getchar();
createFBTanswer(1,1,1,maxD+1,0);
for(i=0;i<l;i++)
{
cout<<getPosition(di[i][1],di[i][0])<<endl;
}
return 0;
}