题意:

斜堆(skew heap)是一种常用的数据结构。它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大。因此在整棵斜堆中,根的值最小。但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定。在本题中,斜堆中各个元素的值均不相同。 在斜堆H中插入新元素X的过程是递归进行的:当H为空或者X小于H的根结点时X变为新的树根,而原来的树根(如果有的话)变为X的左儿子。当X大于H的根结点时,H根结点的两棵子树交换,而X(递归)插入到交换后的左子树中。 给出一棵斜堆,包含值为0~n的结点各一次。求一个结点序列,使得该斜堆可以通过在空树中依次插入这些结点得到。如果答案不惟一,输出字典序最小的解。输入保证有解。

输入:

  第一行包含一个整数n。第二行包含n个整数d1, d2, ... , dn, di < 100表示i是di的左儿子,di>=100表示i
是di-100的右儿子。显然0总是根,所以输入中不含d0。

输出:

  仅一行,包含n+1整数,即字典序最小的插入序列。

Sample0.in

6
100 0 101 102 1 2

Sample0.out

0 1 2 3 4 5 6

Sample1.in

12 
0 101 1 2 3 105 6 4 104 102 10 5

Sample1.out

2 4 1 6 10 7 9 5 11 12 8 3 0

Sample2.in

12 
100 0 102 101 1 2 3 107 8 7 108 5

Sample2.out

8 11 9 7 0 1 10 5 3 4 2 12 6

调了一天QAQ

orz mato神犇 @http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html

性质1:若一个节点没有左儿子,则该节点一定没有右儿子。

     因为右儿子是由左儿子旋转得到的,而在旋转的同时左边一定被插入节点了。

性质2:最后一次插入一定插到极左节点(一直往左走),显然得证。

性质3:最后一次插入节点一定没有右子树,因为它在插入时一定是将原来的某棵子树(可以为空)作为它的左子树。

所以最后插入的节点一定是满足性质2,3的深度最小的节点,删除该点后将其父亲到跟的左右子树交换。

因为如果不选深度最小的,则在交换的时候一定会交换到没有右子树的点,不满足性质1。

特例:若深度最小的满足性质2,3的节点有左儿子且其左儿子为叶子节点,则选其左儿子(字典序最小)

   因为删除其左儿子后该点左右子树为空,满足性质1

所以就不断找最后加入的节点即可,记得考虑在删除根后的影响(我因为这个WA了一下午),还有-1边界的判定

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
int n,tot,top,fa[Mx],l[Mx],r[Mx],ans[Mx];
void find(int root)
{
if(r[root]!=&&l[root]!=) find(l[root]);
else if(l[root]!=&&l[l[root]]==&&r[l[root]]==&&r[root]==)
{
ans[++tot]=l[root];
l[root]=;
}
else if(r[root]==)
{
ans[++tot]=root;
if(l[root]!=) fa[l[root]]=fa[root];
if(fa[root]==-) top=l[root];
else l[fa[root]]=l[root];
}
if(fa[root]!=-) swap(l[fa[root]],r[fa[root]]);
}
int main()
{
scanf("%d",&n);fa[]=-;
for(int i=;i<=n;i++)
{
int d;scanf("%d",&d);
if(d<) fa[i]=d,l[d]=i;
else fa[i]=d-,r[d-]=i;
}
while(tot!=n) find(top); cout<<top<<" ";
for(int i=tot;i>=;i--) cout<<ans[i]<<" ";
return ;
}

bzoj1078【SCOI2008】斜堆的更多相关文章

  1. BZOJ1078 [SCOI2008]斜堆 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1078 题意概括 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的 ...

  2. [bzoj1078][SCOI2008][斜堆] (贪心)

    Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...

  3. BZOJ1078: [SCOI2008]斜堆

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 每一次进入的点一定是一个极左节点,然后将它所处在的整棵树左右翻转.加上一些情况的处理. ...

  4. 【BZOJ1078】[SCOI2008]斜堆(性质题)

    [BZOJ1078][SCOI2008]斜堆(性质题) 题面 BZOJ 洛谷 题解 考虑一下这道题目的性质吧.思考一下最后插入进来的数是什么样子的.首先因为它是最后插入进来的,所以一定是比某个数小,然 ...

  5. 【bzoj1078】[SCOI2008]斜堆

    2016-05-31 16:34:09 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 挖掘斜堆的性质233 http://www.cp ...

  6. BZOJ 1078: [SCOI2008]斜堆

    1078: [SCOI2008]斜堆 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 770  Solved: 422[Submit][Status][ ...

  7. 【BZOJ 1078】 1078: [SCOI2008]斜堆

    1078: [SCOI2008]斜堆 Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中, ...

  8. 【bzoj1078】 SCOI2008—斜堆

    http://www.lydsy.com/JudgeOnline/problem.php?id=1078 (题目链接) 题意 给出一个斜堆,并给出其插入的操作,求一个字典序最小的插入顺序. Solut ...

  9. [SCOI2008]斜堆

    题目大意 1.题目描述 斜堆(skew heap)是一种常用的数据结构. 它也是二叉树,且满足与二叉堆相同的堆性质: 每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. . 但斜堆不必是平衡 ...

  10. P2475 [SCOI2008]斜堆(递归模拟)

    思路 可并堆真是一种神奇的东西 不得不说这道题是道好题,虽然并不需要可并堆,但是能加深对可并堆的理解 首先考虑斜堆的性质,斜堆和左偏树相似,有如下的性质 一个节点如果有右子树,就一定有左子树 最后插入 ...

随机推荐

  1. MYSQL基础知识和操作(二).png

  2. Dynamics CRM 之ADFS 使用 SQL Server 的联合服务器场

    此拓扑用于 Active Directory 联合身份验证服务 (AD FS) 不同于使用 Windows 内部数据库 (WID) 部署拓扑,因为不会将数据复制到每台联合服务器场中的联合身份验证服务器 ...

  3. iOS比较常用的第三方及实例(不断更新中)

    把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...

  4. 前端页面卡顿?或是DOM操作惹的祸,需优化代码

    文档对象模型(DOM)是一个独立 于特定语言的应用程序接口.在浏览器中,DOM接口是以JavaScript语言实现的,通过JavaScript来操作浏览器页面中的元素,这使得 DOM成为了JavaSc ...

  5. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  6. 返回人民币大写方式(num2rmb)

    CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS -- PURPOSE :返回人民币大写方式 v_N ...

  7. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  8. 从零自学Hadoop(18):Hive的CLI和JDBC

    阅读目录 序 Hive CLI(old CLI) Beeline CLI(new CLI) JDBC Demo下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出 ...

  9. 【GSM】GTM900C的应用——短信

    虽说GSM已经很老旧,但其低廉的价格,非常适合一些需要小数据上网传输和短信等功能的应用场合. 不知道GSM能否像51单片机一样,在低端应用中长久不衰.GTM900C发送短信,支持两种模式,TXT和PD ...

  10. Statement对象的executeUpdate返回信息

    int num = sta.executeUpdate(String sql);返回的是我们平时操作数据库客户端时控制台显示的影响行数