浙江省赛2021
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 7;
int cnt;
int tr[N<<1];
vector<int> vec;
void build(int rt, int v, int x) // v 节点数 x 层数
{
tr[rt] = v;
if(x >= cnt) return;
build(rt<<1, v+1, x+1);
build(rt<<1|1, v+1, x+1);
}
void dfs(int rt, int x) // x 深度
{
if(x >= cnt)
{
vec.push_back(tr[rt]);
return ;
}
dfs(rt<<1, x+1);
vec.push_back(tr[rt]);
dfs(rt<<1|1, x+1);
}
int main()
{
int n;
cin>> n;
if(n==1){
cout << 1 << endl;
return 0;
}
int sum = 0;
for(int i = 1; sum < n;)
{
sum += i;
i <<= 1;
cnt ++;
}
build(1,1,1);
dfs(1,1);
for(int i = 0; i < n; i++)
printf(i==n-1?"%d\n":"%d ", vec[i]);
return 0;
}