BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
orz MilkyWay天天做sxt!
首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理)。
转移的时候枚举两棵子树中有多少点、颜色是什么即可。
因为红黑树的深度是\(O(\log n)\)的,所以第二维只需要\(O(\log n)\),所以复杂度是\(O(n^2\log n)\)。代码这里有。
因为问题可以拆分成子问题,所以我们考虑几种节点数较少的子树的情况,然后把这棵子树合并成一个黑点(表示一棵以该黑点为根的子树)。
对于两个黑点,我们可以把它合并成一个黑点。
对于三个黑点,可以合并成一个红点与一个黑点。
对于四个黑点,可以合并成两个红点与一个黑点。
(看图就很好理解了,盗用一下这位dalao的图)

而且只需要考虑这三种情况。
初始的时候前端节点有\(n+1\)个,所以相当于把\(n+1\)个黑点合并至\(1\)个点。
大概也可以这么理解:因为将\(x\)个黑点合并成一个黑点,本质上就是确定\(x-1\)个点选什么颜色。所以我们合并\(n+1\)个点就可以了。
求最小值就每次合并\(2\)个,当有奇数时是\(3\)个点,得补一个红点。
求最大值就每次合并\(4\)个。因为实际上就是每次填\(1\)的深度,所以如果多余\(1\)个要与一个\(4\)拼成\(2\)和\(3\),余下\(2\)个或\(3\)个可以直接单独合并成\(1\)个。最后剩下两个的时候特判下,根节点可以放红点。
另外这样高度限制没有问题,刚开始是一层高度相同的前端节点,然后两个两个合并,高度都会\(+1\)(多出来就合并3个,高度也是\(+1\))。
四个四个合并同理。
//820kb 0ms
#include <cstdio>
int main()
{
int n,ans=0; scanf("%d",&n);
for(int x=n+1; x>1; x>>=1) ans+=x&1;
printf("%d\n",ans), ans=0;
for(int x=n+1; x>1; )
{
if(x==2) ++ans;
switch(x&3)
{
case 0: ans+=x>>1, x>>=2; break;// /4*2
case 1: ans+=(x>>1)-1, x>>=2, ++x; break;// /4*2-1
case 2: ans+=(x>>2)<<1, x>>=2, ++x; break;
case 3: ans+=((x>>2)<<1)+1, x>>=2, ++x; break;
}
}
printf("%d\n",ans);
return 0;
}
BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)的更多相关文章
- BZOJ 3227: [Sdoi2008]红黑树(tree)
BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- Bzoj3227 [Sdoi2008]红黑树(tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 204 Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- [BZOJ 3227] [SDOI 2008] 红黑树(tree)
Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
- CF 461B Appleman and Tree 树形DP
Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)
题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...
随机推荐
- php 数组函数学习
1.array_change_key_case array_change_key_case(array,case)函数将数组的所有的键都转换为大写字母或小写字母.array表示目标数组,case表示转 ...
- Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
Allegro PCB Design GXL (legacy) version 16.6-2015 1.菜单:Setup > User Preferences... 2.User Prefere ...
- jQuery示例
<!DOCTYPE html><html lang="en" class="loading"><head> <meta ...
- 停止Monkey
adb shell top | grep monkey adb shell kill id
- C++ Primer 笔记——控制内存分配
1.当我们使用一条new表达式时,实际执行了三步操作. new表达式调用一个名为operator new ( 或者operator new[] ) 的标准库函数.该函数分配一块足够大的,原始的,未命名 ...
- NPOI操作Excel(三)--解析Excel
通过前面两篇的基础学习,我们对NPOI有了一定了了解,下面就开始进入实战,解析下面格式的Excel(下面只是列举了几个例子),并保存入库 首先我们先分析一下,要解析这样的Excel,需要把指标[橘色背 ...
- 51 Nod 1079 中国剩余定理(孙子定理)NOTE:互质情况
1079 中国剩余定理 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % 2 = 1, K % 3 = 2, K % 5 = 3.符合条件的最小的K = 23. 收起 ...
- Go语言之匿名函数
匿名函数和字面量函数一样, 凡是可以使用字面量函数的地方,都可以用匿名函数代替. 这个和js中的匿名函数差不多吧. package main import "fmt" var su ...
- context日志
class Program { static void Main(string[] args) { List<wolf_example> Listw; using (var ctx = n ...
- javascript 正则表达式(十)
一.什么是正则 在常见的字符串检索和替换中,我们需要提供一种模式表示检索或替换的规则.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. abc [a-z]{4} \d\d\d 二. ...