题解 [SCOI2008]斜堆
好题。一道很有趣的性质提。
因为自己搞错结论然后改了 1h(悲
闲话少说,切入正题——
这是不断插入的,所以根据套路我们会考虑最后一个插入的节点的性质。显然满足:
- 它是从根不停往左走的路上。
- 它没有右子树。
但是这样的点有很多,我们来深入分析。性质 1 说明这些点在一条链上,我们知道插入的时候会将当前节点的左右儿子变换。我们要由此引出第三条性质:一个节点不可能只有右儿子。这是显而易见的。根据性质三,我们可以知道,假设我们有 \(a, b\) 满足性质 1 与性质 2,\(a\) 深度比 \(b\) 大,则会交换 \(b\) 的左右儿子,\(b\) 只有右儿子,与第三条性质相悖。
那么我们就可以知道了,最后一个插入的节点必然是深度最小的满足性质 1,2 的节点。
但是也有例外,假设我们这样一棵条链:0-1为什么画图都要偷懒!正确答案应该是 1 0,但是如果按照上面的算法就是 0 1。
我们会发现删除 1 反转它的祖先依旧可以保证所有节点满足性质 3。这是因为首先它的父亲是 0 本身满足性质 1 与性质 2 没有右子树,其次 1 是叶子节点,没有子树,因此不需要给 0 新增儿子。
我们能得到另外一个性质,令当前满足性质 1 性质 2 的最浅节点为 \(d\),若 \(d\) 的左儿子是叶子节点,就选择删除 \(d\) 的左儿子,否则删除 \(d\)。
删除以后把自己的子树给父亲,反转祖宗的左右儿子。
//SIXIANG
#include <iostream>
#include <vector>
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int ch[MAXN + 10][3], a[MAXN + 10], rt;
//0 左儿子 1 右儿子 2 父亲
int Find() {
int now = rt;
while(1) {
if(ch[now][1] == -1) return now;
now = ch[now][0];
}
}
bool isleaf(int x) {
return ((ch[x][0] == ch[x][1]) && (ch[x][0] == -1));
}
int Delete() {
int d = Find();
if(d != -1 && isleaf(ch[d][0])) d = ch[d][0];
if(d == rt)
rt = ch[d][0];
else {
ch[ch[d][2]][0] = ch[d][0];
if(ch[d][0] != -1) ch[ch[d][0]][2] = ch[d][2];
int to = ch[d][2];
while(to != -1) {
swap(ch[to][0], ch[to][1]);
to = ch[to][2];
}
}
return d;
}
int main() {
int n; cin >> n;
for(int p = 0; p <= n; p++) ch[p][0] = ch[p][1] = ch[p][2] = -1;
for(int p = 1; p <= n; p++) {
cin >> a[p];
if(a[p] >= 100) ch[a[p] - 100][1] = p, ch[p][2] = a[p] - 100;
else ch[a[p]][0] = p, ch[p][2] = a[p];
}
for(int p = 0; p <= n; p++)
a[n - p] = Delete();
for(int p = 0; p <= n; p++)
cout << a[p] << ' ';
}
题解 [SCOI2008]斜堆的更多相关文章
- 【BZOJ1078】[SCOI2008]斜堆(性质题)
[BZOJ1078][SCOI2008]斜堆(性质题) 题面 BZOJ 洛谷 题解 考虑一下这道题目的性质吧.思考一下最后插入进来的数是什么样子的.首先因为它是最后插入进来的,所以一定是比某个数小,然 ...
- 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]斜堆 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1078 题意概括 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的 ...
- [SCOI2008]斜堆
题目大意 1.题目描述 斜堆(skew heap)是一种常用的数据结构. 它也是二叉树,且满足与二叉堆相同的堆性质: 每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. . 但斜堆不必是平衡 ...
- P2475 [SCOI2008]斜堆(递归模拟)
思路 可并堆真是一种神奇的东西 不得不说这道题是道好题,虽然并不需要可并堆,但是能加深对可并堆的理解 首先考虑斜堆的性质,斜堆和左偏树相似,有如下的性质 一个节点如果有右子树,就一定有左子树 最后插入 ...
- 【bzoj1078】 SCOI2008—斜堆
http://www.lydsy.com/JudgeOnline/problem.php?id=1078 (题目链接) 题意 给出一个斜堆,并给出其插入的操作,求一个字典序最小的插入顺序. Solut ...
- P2475 [SCOI2008]斜堆
题目背景 四川2008NOI省选 题目描述 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相 同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小. 但 ...
- [bzoj1078][SCOI2008][斜堆] (贪心)
Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...
随机推荐
- Springboot 2.3.1配置拦截器遇到的坑
1.多个配置类继承WebConfigureSupport或实现WebConfigure接口导致拦截器失效 2.拦截器中的bean无法正常注入,SpringBoot项目的Bean装配默认规则是根据App ...
- GKCTF2021 MISC
1.签到 当时没签上┭┮﹏┭┮: 追踪http流,发现依次执行[ls][ls/][whoami] 发现存在[fl4g],同时发现破解的规则为hex decode->base64 decode-& ...
- 【实时数仓】Day06-数据可视化接口:接口介绍、Sugar大屏、成交金额、不同维度交易额(品牌、品类、商品spu)、分省的热力图 、新老顾客流量统计、字符云
一.数据可视化接口介绍 1.设计思路 后把轻度聚合的结果保存到 ClickHouse 中后,提供即时的查询.统计.分析 展现形式:用于数据分析的BI工具[商业智能(Business Intellige ...
- OpenAI 推出超神 ChatGPT 注册教程来了
前几天,OpenAI 推出超神 ChatGPT,非常火爆.但是呢,因为不可抗力原因,大部分人无法体验到.这里我分享一下注册的攻略. 准备 首先能能访问 Google(前置条件,不能明确说,懂得都懂) ...
- HBX更新后无法打包
HBX更新到3.2.2.20210818后H5打包增加了校验 HBuilder X - Release Notes ====================================== 3.2 ...
- angr_ctf——从0学习angr(三):Hook与路径爆炸
路径爆炸 之前说过,angr在处理分支时,采取统统收集的策略,因此每当遇见一个分支,angr的路径数量就会乘2,这是一种指数增长,也就是所说的路径爆炸. 以下是路径爆炸的一个例子: char buff ...
- IdentityServer4 - V4 概念理解及认证授权过程
概念理解 Scope 范围,它的定义比较宽泛,可大可小.大到可把多个包含相同Scope的站点或服务形成一个虚拟的组,也可以是站点或服务的子级:小到身份所需要包含的信息,以精确出哪种身份. Client ...
- 使用Springboot+redis+Vue实现秒杀的一个Demo
目录 1.Redis简介 2.实现代码 3.启动步骤 4.使用ab进行并发测试 5.线程安全 6.总结 7.参考资料 1.Redis简介 Redis是一个开源的key-value存储系统. Redis ...
- CFS三层内网靶场
前言 最近学习了内网的一些知识,想着打一下靶场来试试,选择了这个CFS的三层内网靶场,做一下记录 靶场下载地址 链接:https://pan.baidu.com/s/1zGw5VNt222nCmf ...
- 反馈电路的Bode分析法
1 前言 在反馈电路的分析中,如果前向放大倍数为Aopen,反馈系数为β,则闭环传递函数Aclose=Aopen/(1+Aopenβ),其中Aopenβ为环路增益.但是,在Aopen和β的计算中均要考 ...