[BZOJ 3227] [SDOI 2008] 红黑树(tree)
Description
红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色。若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点。并规定所有前端结点的高度为-1。
一棵红黑树是满足下面“红黑性质”的染色二叉搜索树:
(1) 每个结点被染成红色或黑色;
(2) 每个前端结点为黑色结点;
(3) 任一红结点的子结点均为黑结点;
(4) 在从任一结点到其子孙前端结点的所有路径上具有相同的黑结点数。
从红黑树中任一结点 \(x\) 出发(不包括结点 \(x\)),到达一个前端结点的任意一条路径上的黑结点个数称为结点 \(x\) 的黑高度,记作 \(bh(x)\)。红黑树的黑高度定义为其根结点的黑高度。
给定正整数 \(N\),试设计一个算法,计算出在所有含有 \(N\) 个结点的红黑树中,红色内结点个数的最小值和最大值。
Input
输入共一个数 \(N\)。
Output
输出共两行。
第一行为红色内结点个数的最小值,第二行为最大值。
Sample Input
8
Sample Output
1
4
HINT
对于 100% 的数据,\(1≤N≤5000\)
Solution
设 \(f[i][j][0/1]\) 表示节点数为 \(i\) 的子树,该树的黑高度为 \(j\),根节点颜色为红/黑,容易想出 \(n^3\) 的转移方程:
f[x][h][1]=\min\{f[y][h-1][0/1]+f[x-y-1][h-1][0/1]\}
\]
有个性质,黑高度是 \(O(\log n)\) 级别的,那么复杂度就可以降为 \(O(n^2\log n)\)。
这里还有一种 \(O(\log n)\) 的贪心做法:
一棵 \(n\) 个节点的红黑树,前端节点的个数一定是 \(n+1\) 个,证明考虑先证出一条链的情况,然后无论怎么移动节点都不变。
于是就相当于将 \(n+1\) 个黑点合并成一个根节点,每次我们将一部分黑节点合并成一个黑节点,无非就这三种情况:
(图片来自这里)

这三棵树的黑高度都是相同的,可以逐层合并,对于最小值,我们就两个两个合并,最大值就四个四个合并。具体见代码。
注意代码中加 \(!!!\) 的那一行,由于 \(2/4*2=0\),因此要单独判断。
Code
#include <cstdio>
int main() {
int n, m, ans = 0;
scanf("%d", &n), m = n + 1;
while (m > 1) ans += m & 1, m >>= 1;
printf("%d\n", ans), m = n + 1, ans = 0;
while (m > 1) {
if (m == 2) ++ans, --m; //!!!
else if ((m & 3) == 1) ans += ((m >> 2) << 1) - 1, m = (m >> 2) + 1;
else if ((m & 3) == 2) ans += (m >> 2) << 1, m = (m >> 2) + 1;
else if ((m & 3) == 3) ans += ((m >> 2) << 1) + 1, m = (m >> 2) + 1;
else ans += m >> 1, m >>= 2;
}
printf("%d\n", ans);
return 0;
}
[BZOJ 3227] [SDOI 2008] 红黑树(tree)的更多相关文章
- BZOJ 3227: [Sdoi2008]红黑树(tree)
BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...
- BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...
- Bzoj3227 [Sdoi2008]红黑树(tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 204 Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- [BZOJ 2186][SDOI 2008] 莎拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4519 Solved: 1560[Submit][S ...
- [BZOJ 2186] [SDOI 2008] 沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为 \(1\) 到 \(N\) 的阶乘,但是,政府只发行编号与 \(M!\) 互质的钞票.房地产第 ...
- bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...
- BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛
标题效果:有一个格子组件图,假设三个人在一条直线上,那么第一个人将不会看到第三人.现在,有一个人站在(1,1)在.我问他是否能看到n*n的人数的矩阵. 思考:如果你想站(1,1)这名男子看到了一个立场 ...
- BZOJ-3227 红黑树(tree) 树形DP
个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...
随机推荐
- Redis分布式队列和缓存更新
原文链接:https://www.cnblogs.com/hua66/p/9600085.html 在使用Redis中,我们可能会遇到以下场景: 例如: 某用户向服务器中发送一个请求,服务器将用户请求 ...
- 关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...
- CDN的简单理解
百度百科上的解释:CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...
- 个人博客制作如何选择前端模板 thinkcmf后台加载新模板 CSS js文件
我们的博客后台已经搭建好了,接下来我就要选择一个合适的模板做自己的博客,首先要定位你的博客是做什么用的,是属于什么行业,根据自己博客的定位选择适合的模板. 如果你是设计师,又会前端设计开发,那就可以自 ...
- vue-router 通过路由来实现切换头部标题
在做单页面应用程序时,一般页面布局头尾两块都是固定在布局页面,中间为是路由入口.这时访问页面时头部标题不会变,该问题的解决方案如下: 通过采用组件内路由卫士(beforeRouterEnter.bef ...
- Windows环境下使用pip install安装lxml库
lxml是Python语言和XML以及HTML工作的功能最丰富和最容易使用的库.lxml是为libxml2和libxslt库的一个Python化的绑定.它与众不同的地方是它兼顾了这些库的速度和功能完整 ...
- 章节十、6-CSS---用CSS 定位子节点
以该网址为例(https://learn.letskodeit.com/p/practice) 一.通过子节点定位元素 1.例如我们需要定位这个table表格 2.当我们通过table标签直接定位时, ...
- SQL常用语句(二)
--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...
- hbase 过滤器 rowfilter
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...
- windows docker redis
拉取docker docker pull hub.c.163.com/library/redis:latest 启动docker docker run -p 6379:6379 -d hub.c.16 ...