P2475 [SCOI2008]斜堆(递归模拟)
思路
可并堆真是一种神奇的东西
不得不说这道题是道好题,虽然并不需要可并堆,但是能加深对可并堆的理解
首先考虑斜堆的性质,斜堆和左偏树相似,有如下的性质
- 一个节点如果有右子树,就一定有左子树
- 最后插入的节点一定没有右子树
然后考虑倒序删除节点就可以做了
对一个节点,如果它没有右子树,它就可能是最后插入的点,但是显然还有其他情况
如果它的左子树中还有满足条件的点,则取深度最浅的节点即可,考虑小于等
于当前根的权值的情况时,取深度最深会有问题,可以自行画图
然后如果左子树中只有一个节点,那么两个节点都可以,为保证字典序最小,把权值较大的节点放在答案序列靠后的位置即可
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int lson[150],rson[150],fa[150],n,cnt,ans[150],root;
int getlast(int o){
int ans=o;
while(o!=-1){
if(rson[o]==-1){
ans=o;
break;
}
o=lson[o];
}
if(lson[o]!=-1&&lson[lson[o]]==-1)
ans=lson[o];
return ans;
}
void del(int o,int val){
while(fa[o]!=-1){
swap(lson[fa[o]],rson[fa[o]]);
o=fa[o];
}
}
int main(){
scanf("%d",&n);
cnt=n+1;
memset(ans,-1,sizeof(ans));
memset(lson,-1,sizeof(lson));
memset(rson,-1,sizeof(rson));
memset(fa,-1,sizeof(fa));
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x<100){
lson[x]=i;
fa[i]=x;
}
else{
rson[x-100]=i;
fa[i]=x-100;
}
}
fa[0]=-1;
root=0;
while(cnt--){
int x=getlast(root);
ans[cnt]=x;
lson[fa[x]]=lson[x];
if(lson[x]!=-1)
fa[lson[x]]=fa[x];
del(x,x);
fa[x]=-1;
if(x==root)
root=lson[x];
}
for(int i=0;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}
P2475 [SCOI2008]斜堆(递归模拟)的更多相关文章
- P2475 [SCOI2008]斜堆
题目背景 四川2008NOI省选 题目描述 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相 同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. 但 ...
- BZOJ 1078: [SCOI2008]斜堆
1078: [SCOI2008]斜堆 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 770 Solved: 422[Submit][Status][ ...
- 【bzoj1078】[SCOI2008]斜堆
2016-05-31 16:34:09 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 挖掘斜堆的性质233 http://www.cp ...
- 【BZOJ 1078】 1078: [SCOI2008]斜堆
1078: [SCOI2008]斜堆 Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中, ...
- 【BZOJ1078】[SCOI2008]斜堆(性质题)
[BZOJ1078][SCOI2008]斜堆(性质题) 题面 BZOJ 洛谷 题解 考虑一下这道题目的性质吧.思考一下最后插入进来的数是什么样子的.首先因为它是最后插入进来的,所以一定是比某个数小,然 ...
- [bzoj1078][SCOI2008][斜堆] (贪心)
Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...
- [SCOI2008]斜堆
题目大意 1.题目描述 斜堆(skew heap)是一种常用的数据结构. 它也是二叉树,且满足与二叉堆相同的堆性质: 每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. . 但斜堆不必是平衡 ...
- BZOJ1078 [SCOI2008]斜堆 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1078 题意概括 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的 ...
- 【bzoj1078】 SCOI2008—斜堆
http://www.lydsy.com/JudgeOnline/problem.php?id=1078 (题目链接) 题意 给出一个斜堆,并给出其插入的操作,求一个字典序最小的插入顺序. Solut ...
随机推荐
- python-demo实例
1.turtle库与蟒蛇案例 import turtle def drawSnake(rad,angle,len,neckrad): for i in range(len): turtle.circl ...
- hdu3374 最大最小表示法 +kmp
#include <iostream> #include <algorithm> #include <string.h> #include <cstdio&g ...
- jQuery属性--addClass()和removeClass()
addClass(class|fn) 概述 为每个匹配的元素添加指定的类名 参数 class 一个或多个要添加到元素中的CSS类名,请用空格分开: function(index, class) ...
- Gambler Bo (高斯消元求特解)
对于图中的每一个点假设点击Xi * m + j 然后每个点都有那么对于每一个点可以列举出一个方程式,n*m个点解n*m个未知数.利用高斯消元就可以解决. 问题就在这个题目可能不止有一个特,所以我们需要 ...
- 刨根究底字符编码之—UTF-16编码方式
在网上已经转悠好几天了, 这篇文章让我知道了UTF-16的前世今生, 感谢作者https://cloud.tencent.com/developer/article/1384687 1. UTF-16 ...
- Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
1.问题场景描述:后台方法中执行查询返回list列表中,执行后台产生运行时异常 java.sql.SQLException: 2.问题排查和解决:排查代码,无编译时错误,断点调试,更具控制台找到对应的 ...
- PIVOT(透视转换)和UNPIVOT(逆透视转换)
一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...
- 项目方说性能达到百万TPS,如何测试它的可信度?
项目方说性能达到百万TPS,如何测试它的可信度? 应用系统性能提升的关键在于运维端的接入管理模型(AAA,认证 Authentication.授权 Authorization.计费 Accountin ...
- vue去掉严格开发,即去掉vue-cli安装时的eslint
vue去掉严格开发,即去掉vue-cli安装时的eslint : 1.vue-cli书写规范(主要是js规范) a.逗号.冒号后面要加空格 b.不能使用双引号,一律使用单引号 webpack的语法检查 ...
- Symfony2 UserSecurityEncoder实现自己的验证方式
fosuserbundle默认使用sha512加密 如果要实现自己的加密方式 需要继承Symfony\Component\Security\Core\Encoder\BasePasswordEncod ...