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 ...
随机推荐
- Windows server 2008 R2实现多用户远程连接 (转)
经常使用远程桌面的朋友可能会注意到,Windows server 2008 R2中,远程桌面最多只允许两个人远程连接,第三个人就无法连接过去,但是生产环境中有一些服务器可能有许多人需要连接上去,而微软 ...
- HashSet, HashTable
HashTable 存储键值对 , Hashtable和Dictionary<TKey,TValue>都是存键值对 HashSet 只存储值,盛放不同的数据,相同的数据只保留一份 Hash ...
- KKT条件原理
问题引入 max f(x, y) s.t. g(x,y) <= 0 几何解释 a. g(x ,y) <= 0为上图中z = 0平面中的圆,圆的边表示g(x, y) = 0,圆的内部表示g ...
- 初探AngularJs框架(一)
一.需要准备的环境 Nodejs:https://nodejs.org/en/download/ Python:https://www.python.org/downloads/release/pyt ...
- java was started but exit code =-805306369
打开STS 时报 java was started but exit code =-805306369这个错,一个页面. 原因我把STS里面的默认jdk换成了7.但是STS的ini文件里依赖的 ...
- [转载] mysql 索引中的USING BTREE 的意义
索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总 ...
- FAQ About WOYO PDR007 Dent Removal Heat Induction System
WOYO PDR 007 is a dent repair tool for auto maintence. WOYO PDR007 Auto Body Paintless Dent Repair K ...
- easyui datagrid 遇到的坑 cannot read property ·· pageNum bug and so on
1 本人刚刚接到一个bug,就是初始化时若设置了datagrid到指定页数,点击下一页显示不对,4 --> ‘4’+1=41的字符串形式,再点击超出页码范围直接到最后一页: 原因:因为 page ...
- mysql 查询重复值
SELECT `code`,count(`code`) as count FROM `yt_coupon` GROUP BY `code` HAVING count(`code`) > ...
- Golang内存分配内置函数之new函数
new函数用来分配内存,主要分配值类型,比如int.float32.struct等,返回的是指针 package main import ( "fmt" ) func main() ...