正题
题目链接:https://jzoj.net/senior/#contest/show/2940/0
题目大意
一颗满二叉树,第iii个点的儿子是i∗2i*2i∗2和i∗2+1i*2+1i∗2+1,然后nnn个数填入,求一个满足小根堆性质的字典序最大的路线。
解题思路
我们计算出每个点下面有多少个点,然后贪心选择最大的即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=65540;
int n,a[N],b[N];
void dfs(int x,int l,int r,int z)
{b[x]=a[l];z--;if(!z) return;dfs(x*2,l+z/2+1,r,z/2);dfs(x*2+1,l+1,l+z/2,z/2);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);dfs(1,1,n,n);for(int i=1;i<=n;i++)printf("%d ",b[i]);
}