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). 对于两个要删除的 ...
随机推荐
- lightoj1259 线性筛的另一种写法 v变成bool标记数组
也是用线性筛,但是v用int会爆,所以这个线性筛用的是另外一种写法 #include<cstdio> #include<cmath> #include<queue> ...
- uva11865 二分流量+最小生成树
uva好题真多 本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界 上代码,觉得最小树形图的代码很优美 /* 题意:给定n个点, ...
- bzoj 1222
比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可 本题卡空间,需要滚动数组优化 本题卡时间,稍微卡下常就行 #inc ...
- Java将文件中的内容转换为sql语句(和并发定时读取文件)
数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...
- spring coud Feign常用配置
Ribbon配置 在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如: # 设置连接超时时间 ribbon.ConnectTimeout=500 ...
- jexus linux x64 [专业版] 安装和配置https
一.环境 操作系统:centOs7-x64 二.准备工作 购买SSL/TLS证书 三.部署 1.首先查看“/lib”或“/usr/lib”等系统库文件夹中是否有SSL库文件的名字,该文件名应该是“li ...
- 一脸懵逼学习Hadoop-HA机制(以及HA机制的配置文件,测试)
1:能否让两个NameNode都正常影响客户端请求? 应该让两个NameNode节点在某个时间只能有一个节点正常影响客户端请求,相应请求的必须为Active状态的那一台. 2:standBy状态的节点 ...
- Windows Phone MultiBinding :Cimbalino Toolkit
在WPF和WIN8中是支持MultiBinding 这个有啥用呢,引用下MSDN的例子http://msdn.microsoft.com/en-us/library/system.windows.da ...
- Redis-Sentinel 哨兵
为什么需要哨兵? 一旦主节点宕机,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点 那么这个问题,redis-sentinel就可以解决了 什么是 ...
- 【CF666E】Forensic Examination
题解: 熟练掌握了后缀自动机后大部分题目应该都比较容易想 首先对t建立广义后缀自动机 然后我们可以用线段树合并处理出每个点每个串出现的次数,然后求出最大值 匹配的时候比较巧妙 我们离线处理 对于同一个 ...