记录编号 |
366113 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
[SCOI 2008] 斜堆 |
最终得分 |
100 |
用户昵称 |
小一米 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.007 s |
提交时间 |
2017-01-22 18:26:03 |
内存使用 |
0.31 MiB |
显示代码纯文本
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- int n,root;
- int fa[55],son[55][2],ans[55],siz[55];
- int cal(int x)
- {
- if (son[x][0]==-1) return x;
- if (son[x][1]==-1&&siz[son[x][0]]>1) return x;
- if (son[x][1]!=-1) return cal(son[x][0]);
- else return max(x,cal(son[x][0]));
- }
- void del(int x)
- {
- int t=fa[x];
- if (t!=-1) son[t][0]=son[x][0];
- if (son[x][0]!=-1) fa[son[x][0]]=t;
- if (fa[x]==-1) root=son[x][0];
- for (;t!=-1;t=fa[t])
- {
- --siz[t];
- swap(son[t][0],son[t][1]);
- }
- }
- main()
- {
- freopen("heap.in","r",stdin);
- freopen("heap.out","w",stdout);
- scanf("%d",&n);
- memset(fa,-1,sizeof(fa));
- memset(son,-1,sizeof(son));
- for (int x,i=1;i<=n;++i)
- {
- scanf("%d",&x);
- if (x<100) son[x][0]=i,fa[i]=x;
- else son[x-100][1]=i,fa[i]=x-100;
- }
- siz[0]=1;
- for (int i=n;i>=1;--i) ++siz[i],siz[fa[i]]+=siz[i];
- root=0;
- for (int i=n;i>=0;--i)
- ans[i]=cal(root),
- del(ans[i]);
- for (int i=0;i<=n;++i) printf("%d ",ans[i]);
- }