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)的更多相关文章

  1. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  2. BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划

    首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...

  3. Bzoj3227 [Sdoi2008]红黑树(tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...

  4. [BZOJ 3227] [SDOI 2008] 红黑树(tree)

    Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...

  5. BZOJ3227 [sdoi2008]红黑树

    贪心什么的太神仙了( 老老实实dp于是就是沙茶题了 f[i][d][0/1]表示i个节点bh为d当前节点颜色白/黑[好好读题是真.. 转移一下然后就可以打表了( 由于我们发现这玩意很好卡有很好的性质( ...

  6. BZOJ-3227 红黑树(tree) 树形DP

    个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...

  7. 红黑树(二)之 C语言的实现

    概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...

  8. 红黑树的C语言实现

    rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...

  9. 物联网安全himqtt防火墙数据结构之红黑树源码分析

    物联网安全himqtt防火墙数据结构之红黑树源码分析 随着5G的发展,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWa ...

随机推荐

  1. eclipse使用STS插件 报错:SocketTimeoutException: Read timed out

    新建boot项目后,提示: SocketTimeoutException: Read timed out 解决: 在eclipse.ini末尾,追加: -Djava.net.preferIPv4Sta ...

  2. 基于python检测端口是否在使用

    开发中,需要开启Modbus Slave服务,但是,modbus_tk 并没有提供一个端口检测的方法,导致 modbus_tcp.TcpServer(port=502) 时候会提示端口被占用 于是需要 ...

  3. Java-IO中的节点流和处理流

    理解好Java-IO中的节点流和处理流是理解Java输入.输出的关键基础,因此,了解节点流和处理流相关的知识点尤为重要. 1.定义 (1)节点流:可以从或向一个特定的地方(节点)读写数据.如FileR ...

  4. listview适配器中的控件的点击事件并传值

    @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto ...

  5. JS arguments转array

    JS arguments转array? Array.prototype.slice.call(arguments)

  6. stm32 PWM输出学习

    STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.通用定时器也能同时产生多达 4路 ...

  7. Andrew Ng 的 Machine Learning 课程学习 (week5) Neural Network Learning

    这学期一直在跟进 Coursera上的 Machina Learning 公开课, 老师Andrew Ng是coursera的创始人之一,Machine Learning方面的大牛.这门课程对想要了解 ...

  8. uml的十三种图形

    1.用例图:对系统的使用方式分类. 2.类图:显示类和它们的相互关系. 3.对象图:只显示对象及它们的相互关系. 4.活动图:显示人或对象的活动,其方式类似于流程图. 5.状态机图:显示生命周期比较有 ...

  9. Ajax异步封装

    //自己封装了一个异步方法. //第一个参数:GET或者是POST,二个参数:请求的url地址, //第三个:是否异步第四个:往后台发送的Post的数据,最后一个后台返回数据之后,处理数据的回调函数. ...

  10. java并发编程,通过Future取消任务

    功能:通过Executor框架提供的线程池,提交任务,使用Future取消任务 任务:增长序列号,从0开始隔1s增长1 通过Future指定时间取消任务 IncrementSequence.java ...