BZOJ 3227: [Sdoi2008]红黑树(tree)
BZOJ 3227: [Sdoi2008]红黑树(tree)
标签(空格分隔): OI-BZOJ OI-其它
Time Limit: 10 Sec
Memory Limit: 128 MB
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####
可以把所有的前端节点看做初始物品,每次合并2个物品,把一个点看成其子树内的点的并。
算出前端节点的个数。
开始的时候有m个黑节点,为了转换为子问题,我们考虑将黑节点合并为新黑节点。
且原黑节点和新黑节点直接没有其它黑节点,实现问题规模缩小。
因此每个黑节点都要参与“合并”
有3种方案(用花括号表示红节点,中括号表示黑节点):
(1)将2个黑节点合并为1个黑节点
(2)将3个黑节点合并为1个红节点和1个黑节点形如[{[][]}[]]
(3)将4个黑节点合并为2个红节点和1个黑节点形如[{[][]}{[][]}]
所以可以贪心解决此问题
Code####
#include<stdio.h>
using namespace std;
int read()
{int s=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-'0';ch=getchar();}
return s*f;
}
//smile please
int n,m;
int ans;
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read();
m=n+1;
ans=0;
while(m>1)
{if(m&1)
ans++;
m/=2;
}
printf("%d\n",ans);
m=n+1;
ans=0;
while(m>1)
{if(m==2)ans++;
if((m&3)==1)
ans+=m/4*2-1,m/=4,m++;
else if((m&3)==2)
ans+=m/4*2,m/=4,m++;
else if((m&3)==3)
ans+=m/4*2+1,m/=4,m++;
else
if(!(m&3))
ans+=m/4*2,m/=4;
}
printf("%d\n",ans);
//fclose(stdin);
//fclose(stdout);
return 0;
}
BZOJ 3227: [Sdoi2008]红黑树(tree)的更多相关文章
- BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- Bzoj3227 [Sdoi2008]红黑树(tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 204 Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...
- [BZOJ 3227] [SDOI 2008] 红黑树(tree)
Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...
- BZOJ3227 [sdoi2008]红黑树
贪心什么的太神仙了( 老老实实dp于是就是沙茶题了 f[i][d][0/1]表示i个节点bh为d当前节点颜色白/黑[好好读题是真.. 转移一下然后就可以打表了( 由于我们发现这玩意很好卡有很好的性质( ...
- BZOJ-3227 红黑树(tree) 树形DP
个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...
- 红黑树(二)之 C语言的实现
概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...
- 红黑树的C语言实现
rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...
- 物联网安全himqtt防火墙数据结构之红黑树源码分析
物联网安全himqtt防火墙数据结构之红黑树源码分析 随着5G的发展,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWa ...
随机推荐
- hxq的库
在页面中使用 可以调取html模板 /** * Created by DY040 on 2017/10/31. */ var hxq = { init: function () { var self ...
- SSL证书切换
SSL证书:SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书.SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务 ...
- pageX,clientX,offsetX,screenX,offsetLeft,style.left,offsetWidth,scrollWidth的区别以及使用详解
https://www.cnblogs.com/echolun/p/9231760.html
- Win2003 控制面板 打不开
windown 2003 控制面板打不开 在运行框中输入regedit,进入注册表中的 HKEY_LOCAL_MACHINE/SYSTEM\Current ControlSet\Control\NLS ...
- Hadoop Intro - Configure
Hadoop学习(二) Hadoop配置文件参数详解 Hadoop运行模式分为安全模式和非安全模式,在这里,我将讲述非安全模式下,主要配置文件的重要参数功能及作用,本文所使用的Hadoop版本为2 ...
- (转)shell脚本输出带颜色字体
shell脚本输出带颜色字体 原文:http://blog.csdn.net/andylauren/article/details/60873400 输出特效格式控制:\033[0m 关闭所有属性 ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 特殊的流程控制语句break continue exit
break语句可以结束当前的for.foreach.while.do-while.或者switch的执行. for($i=1; $i<10; $i++) { if($i == 5) { echo ...
- better-scroll 遇到的问题 3 (transition-group 相关)
今天在使用vue动画 transition-group 和 better-scroll 的时候,出现了下拉列表不能滚动的问题. 问题描述: 我写了一个scroll的基础组件,组件接受一个data参数, ...
- jwt-simple过期时间不对问题
今天用node写后台,登录认证使用了token,然后就使用了简单的jwt-simple,但是发现设置的过期时间不对,一直没有提示过期,但是明明是已经过期了的时间,于是检查了下jwt-simple的源代 ...