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(本地目 ...
随机推荐
- ajaxfileupload异步上传
=====================upload.html======================= <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- mysql启动脚本-my
#!/bin/sh PREFIX=/opt/mysql mysql_username="root" mysql_password=" mysql_port= functi ...
- 【进阶技术】一篇文章搞掂:Docker
注意!!注意系统内存,一开始我使用阿里云1核1G系统,各种问题,搞了几天,原来是内存不足 一.使用VM虚拟机,安装CentOS7.X系统,并安装和使用Docker 1.1.虚拟机安装CentOS7.X ...
- 2019牛客第八场多校 D_Distance 三维BIT或定期重建套路
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)D_Distance) 题意: 在三维空间\((n\times m\times h\le 100000)\)内,有\(q(q\le 100 ...
- ThinkPHP5使用jwt进行会话验证
以往,没有做过前后端分离的项目之前,都是服务器渲染的模板,然后用cookie和session进行账号的权限验证或者是登录状态的管理.后来接触了vue和小程序之后,在进行前后端分离的时候,就会遇到权限验 ...
- tp5 thinkphp 使用phpqrcode生成带Logo的二维码
1 下载生成二维码类库 composer require aferrandini/phpqrcode 2 点击按钮下载 //二维码下载 public function down_qrcode() { ...
- (57)C# frame4 调用frame2
http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx https://www.cnblogs.com/weixing/archive/2012/0 ...
- 7-4 IP思考
内网ip和公网Ip 什么是内网IP: 一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网.而这些企业或学校的机器 ...
- Linux下tomcat启动慢,阻塞
声明:本文为转载,请尊重版权,原文地址: https://www.cnblogs.com/songjinju/p/7505564.html 这两天在linux部署完tomcat以后,发现每次启动都非常 ...
- 【单例模式】懒汉式的线程安全问题 volatile的作用
原文链接:https://blog.csdn.net/Activity_Time/article/details/96496579 ****** 1. 懒汉式的Java实现 public class ...