按照完全二叉树理解 n个数正好对应n个位置 镜像的写法最后在判断
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<vector> #include<map> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 1000700 int w[N],a[N],ans,dis[N],falg,n,vis[N]; void Q(int e,int x,int y) { if(a[x]==-1) { a[x]=w[y]; return ; } if(e>=a[x]) Q(e,x*2,y); else Q(e,x*2+1,y); } void QQ(int x) { queue<int>Q; Q.push(x); while(Q.size()) { int ww=Q.front();Q.pop(); if(a[ww]==-1) continue; vis[ans++]=a[ww]; Q.push(ww*2); Q.push(ww*2+1); } } int main() { int n; scanf("%d",&n); fill(a,a+N,-1); for(int i=1; i<=n; i++) scanf("%d",&w[i]); for(int i=1; i<=n; i++) Q(w[i],1,i); ans=1; QQ(1); for(int i=1;i<=n;i++) printf("%d%c",vis[i],i==n?'\n':' '); int falg=0; for(int i=1;i<=n;i++) if(a[i]==-1) falg=1; if(!falg) printf("YES\n"); else printf("NO\n"); return 0; }