1 条题解
-
0woodhaert LV 5 MOD @ 2017-09-27 19:47:08
#include<cstdio> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> using namespace std; int n,d[100001]; void swp(int &a1,int &a2,int &a3) { if(a1>a2) swap(a1,a2); if(a1>a3) swap(a1,a3); if(a2>a3) swap(a2,a3); } int search(int pos,int key) { int d1=d[pos<<1],d2=d[pos<<1|1],d3=key; swp(d1,d2,d3); if(d1==key) return pos; else if(d[pos<<1]==d1) return search(pos<<1,d1); else if(d[pos<<1|1]==d1) return search(pos<<1|1,d1); } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d",&n); //memset(d,127,sizeof(d)); for(int i=1;i<=n;i++) scanf("%d",&d[i]); for(int i=1;i<=n;i++) { if(i*2==n) { int a1=d[i],a2=d[i<<1]; d[i]=min(a1,a2),d[i<<1]=max(a1,a2); break; } int a1=d[i],a2=d[i<<1],a3=d[i<<1|1]; swp(a1,a2,a3); if(d[i]==a1) continue; if(d[i<<1]==a1) { swap(d[i],d[i<<1]); continue; } d[i]=a1; int dep1=search(i<<1,a2),dep2=search(i<<1|1,a2); if(dep1<dep2) d[i<<1]=a2,d[i<<1|1]=a3; else d[i<<1]=a3,d[i<<1|1]=a2; /*for(int j=1;j<=n;j++) printf("%2d ",d[j]); printf("\n");*/ } for(int i=1;i<=n;i++) printf("%d ",d[i]); return 0; }
只过了样例。。。
- 1
信息
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者