记录编号 366113 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [SCOI 2008] 斜堆 最终得分 100
用户昵称 Gravatar小一米 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2017-01-22 18:26:03 内存使用 0.31 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5. int n,root;
  6. int fa[55],son[55][2],ans[55],siz[55];
  7. int cal(int x)
  8. {
  9. if (son[x][0]==-1) return x;
  10. if (son[x][1]==-1&&siz[son[x][0]]>1) return x;
  11. if (son[x][1]!=-1) return cal(son[x][0]);
  12. else return max(x,cal(son[x][0]));
  13. }
  14. void del(int x)
  15. {
  16. int t=fa[x];
  17. if (t!=-1) son[t][0]=son[x][0];
  18. if (son[x][0]!=-1) fa[son[x][0]]=t;
  19. if (fa[x]==-1) root=son[x][0];
  20. for (;t!=-1;t=fa[t])
  21. {
  22. --siz[t];
  23. swap(son[t][0],son[t][1]);
  24. }
  25. }
  26. main()
  27. {
  28. freopen("heap.in","r",stdin);
  29. freopen("heap.out","w",stdout);
  30. scanf("%d",&n);
  31. memset(fa,-1,sizeof(fa));
  32. memset(son,-1,sizeof(son));
  33. for (int x,i=1;i<=n;++i)
  34. {
  35. scanf("%d",&x);
  36. if (x<100) son[x][0]=i,fa[i]=x;
  37. else son[x-100][1]=i,fa[i]=x-100;
  38. }
  39. siz[0]=1;
  40. for (int i=n;i>=1;--i) ++siz[i],siz[fa[i]]+=siz[i];
  41. root=0;
  42. for (int i=n;i>=0;--i)
  43. ans[i]=cal(root),
  44. del(ans[i]);
  45. for (int i=0;i<=n;++i) printf("%d ",ans[i]);
  46. }