SCP-bzoj-1078
项目编号: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的更多相关文章
- BZOJ 1078: [SCOI2008]斜堆
1078: [SCOI2008]斜堆 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 770 Solved: 422[Submit][Status][ ...
- 【BZOJ 1078】 1078: [SCOI2008]斜堆
1078: [SCOI2008]斜堆 Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中, ...
- bzoj 1078 [SCOI2008]斜堆 —— 斜堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1078 考察斜堆的性质: 一个点如果没有左子树,也一定没有右子树: 看了这篇精美的博客:htt ...
- BZOJ 1078 斜堆
感谢MATO大神的博客 http://www.cppblog.com/MatoNo1/archive/2013/03/03/192131.html 注意细节. #include<iostream ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- 【BZOJ】【2127】happiness
网络流/最小割 Orz Hzwer. 这题他题解说的比较简略……我手画了个图才明白过来…… 嗯对于每个人选文or理的单独收益大家应该很好理解……连S->i 权值为选文的喜悦值,i->T权值 ...
- bzoj一句话题解
发现好多人都在搞这个...本人也想来试试(Solved刚到70就搞这个靠不靠谱啊喂).会更新的.嗯. 1000-1029 1000 A+B problem (这个还需要一句话吗?). 1001 狼抓兔 ...
- Linux scp 设置nohup后台运行
Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...
- scp报错 -bash: scp: command not found
环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...
- 利用scp传输文件
在linux下一般用scp这个命令来通过ssh传输文件. 从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本地目 ...
随机推荐
- 【leetcode】316. Remove Duplicate Letters
题目如下: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...
- vue中filters(过滤器)的使用
在vue中使用filters Vue.js自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的尾 ...
- java中的成员变量、类变量,成员方法、类方法 属性和方法区别
成员变量:包括实例变量和类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用. 类变量:静态域,静态字段,或叫静态变量,它属于该类所有实例共有 ...
- Session 工作原理
Session 工作原理 1.创建Session 当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户 ...
- 对于页面上下载pdf或者excel按钮的实现
这个主要是通过 window.open(url + params) url后台给存放的路径,params是参数
- express框架总结
1.express教程及api : http://www.runoob.com/nodejs/nodejs-express-framework.html 2.nodejs的express自动生成项目框 ...
- 【Java架构:基础技术】一篇文章搞掂:MyBatis
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文主要总结于刘增辉的<MyBatisc从入门到精通>一书,有兴趣的朋友可以自行研读 建议仔细研读官方文档: http ...
- 再次安装双linux系统及kali的grub修复!
打算下学期不带笔记本,平时编程上网本就够了,也就看看一般的算法,于是那上网本装centos7和kali,上网本是APU,但是这两个版本的linux都支持的不错. 先安装centos,由于熟悉了linu ...
- CTO 技能图谱skill-map
# CTO 技能图谱 ### 岗位职责* 建立技术团队文化* 规划技术发展路线* 落地产品研发成果* 宣传公司技术品牌* 吸引优秀技术人才 ### 基本素质* 正直诚实的道德修养* 谦虚谨慎的工作态度 ...
- C++——class类和struct结构体的唯一区别
唯一的区别:默认访问权限不同,其他没有任何区别. class Base{/****/}; class D1:Base{/****/};//默认D1对Base是public继承 struct D2:Ba ...