项目编号:bzoj-1078

项目等级:Safe

项目描述:

  戳这里

特殊收容措施:

  斜堆有一个著名的性质:如果一个节点没有左子树,则它一定没有右子树,这也是它“斜堆”名称的由来。

  此题通过给出斜堆来生成插入序列,正着构造显然很难,我们考虑倒着删,这样只需考虑最后一个插入斜堆的节点的性质即可。

  考虑一个没有右子树的节点,它的左儿子的子树(不含左儿子自己)一定不会是最后一个插入的节点,我们可以运用反证法:

  设该无右子树的节点为P,P的左儿子为L,如果L的子树(不含L)中有一个最后插入的节点,则在插入这个节点前P的左右子树交换,即插入此节点前P有右子树无左子树,违背了斜堆的基本性质,故原命题成立。

  又根据斜堆的插入方法,最后插入的一个节点一定是一个极左节点。

  因此,通常最后插入的节点一定是一个深度最小的极左节点。

  特殊地,如果L为叶子,则插入L前P为叶子,此时L作为最后一个插入的节点是合法的。又根据斜堆的插入方法,L的权值一定大于P,考虑到生成序列字典序最小,选择权值较大的L作为序列中较靠后的节点显然更优。

  总结一下最后一个插入的节点的寻找方法:先找到深度最小的没有右子树的极左节点,看它的左儿子是不是叶子,若是,则目标节点为左儿子,否则为该节点。

  这样,每次寻找最后一个插入的节点从斜堆中倒序删除即可找出字典序最小的生成序列了。复杂度O(nlog2n)。

附录:

 #include <bits/stdc++.h>
#define range(i,c,o) for(register int i=(c);i<(o);++i)
#define dange(i,c,o) for(register int i=(c);i>(o);--i)
using namespace std; static int n;
int fat[],son[][],ans[];
#define L(x) son[x][0]
#define R(x) son[x][1] int main()
{
scanf("%d",&n);
memset(fat,-,sizeof fat);
memset(son,-,sizeof son);
range(i,,n+)
{
int x; scanf("%d",&x); bool y=x>;
if(y) x-=; son[fat[i]=x][y]=i;
}
int root=;
dange(i,n-,-)
{
int cur=root; for(;~R(cur);cur=L(cur));
if(~L(cur)&&!~L(L(cur))) cur=L(cur);
int fa=fat[cur],ls=L(cur);
~fa?L(fa)=ls:root=ls; if(~ls) fat[ls]=fa;
for(;~fa;fa=fat[fa]) swap(L(fa),R(fa));
ans[i]=cur;
}
printf("%d",root);
range(i,,n) printf(" %d",ans[i]);
return ;
}

SCP-bzoj-1078的更多相关文章

  1. BZOJ 1078: [SCOI2008]斜堆

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

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

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

  3. bzoj 1078 [SCOI2008]斜堆 —— 斜堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1078 考察斜堆的性质: 一个点如果没有左子树,也一定没有右子树: 看了这篇精美的博客:htt ...

  4. BZOJ 1078 斜堆

    感谢MATO大神的博客 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 注意细节. #include<iostream ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. 【BZOJ】【2127】happiness

    网络流/最小割 Orz Hzwer. 这题他题解说的比较简略……我手画了个图才明白过来…… 嗯对于每个人选文or理的单独收益大家应该很好理解……连S->i 权值为选文的喜悦值,i->T权值 ...

  7. bzoj一句话题解

    发现好多人都在搞这个...本人也想来试试(Solved刚到70就搞这个靠不靠谱啊喂).会更新的.嗯. 1000-1029 1000 A+B problem (这个还需要一句话吗?). 1001 狼抓兔 ...

  8. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

  9. scp报错 -bash: scp: command not found

    环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...

  10. 利用scp传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本地目 ...

随机推荐

  1. Vue学习笔记【30】——Vue路由(watch属性的使用)

    考虑一个问题:想要实现 名 和 姓 两个文本框的内容改变,则全名的文本框中的值也跟着改变:(用以前的知识如何实现???) 监听data中属性的改变:  <div id="app&quo ...

  2. TableStore最佳实践:GEO索引打造店铺搜索系统

    摘要: 如何使用TableStore打造店铺搜索系统 一.方案背景 对于一套GEO管理系统,其核心点与瓶颈在于数据库的存储性能与查询能力:一方面,存储服务需要应对海量数据的低延迟存.读,另一方面,存储 ...

  3. Hibernate学习 (一)

    Hibernate错误总结: 1:不能自动创建表.把MySQL的版本的方言修改一下. 首先自己要注意自己的MYSQL版本,然后设置对应的方言 兼容性模式 <property name=" ...

  4. hdu 5885 XM Reserves (FFT建模)

    Problem Description As an eligible Ingress Resistance Agent you should know your power source, the E ...

  5. xcode Delete current line

    Delete a line like eclipse CTRL+D (tested on Xcode 4.5.1) : First of all, change these rights : sudo ...

  6. linux日常---1、linux下安装、查看、卸载包常用命令

    linux日常---1.linux下安装.查看.卸载包常用命令 一.总结 一句话总结: 对比学习 1.linux如何查看系统中安装的程序? rpm -qa   # 查看所有安装的软件包 2.linux ...

  7. 57、saleforce学习笔记(四)

    List类 List在这里就是一个类 List<String> lists = new String[]{'1','3'}; List<String> list1 = new ...

  8. 2、jQuery操作Dom(过滤器与选择器)

    1.属性选择器 <script language="JavaScript"> /** * <input type="button" value ...

  9. Windows 08R2_破解管理员密码

    目录 目录 破解Windows 08R2管理员密码 破解Windows 08R2管理员密码 将登录界面的功能链接变成cmd.exe的链接,通过CMD进入到目录C:\Windows\System32下, ...

  10. 搭建RAID5(5块硬盘)过程并模拟一块磁盘损坏情况

    首先:在配置RAID5之前我们先来了解一下它.RAID5,RAID是指独立磁盘冗余阵列,是把相同的数据存储在多个硬盘的不同地方的方法.通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能 ...