BZOJ

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

  1. BZOJ 3227: [Sdoi2008]红黑树(tree)

    BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...

  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. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

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

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

  6. 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: ...

  7. 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 ...

  8. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  9. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

随机推荐

  1. lightoj1259 线性筛的另一种写法 v变成bool标记数组

    也是用线性筛,但是v用int会爆,所以这个线性筛用的是另外一种写法 #include<cstdio> #include<cmath> #include<queue> ...

  2. uva11865 二分流量+最小生成树

    uva好题真多 本题用二分法找flow,把流量小于flow的全部筛掉,剩下的边建立最小树形图,如果权值大于c或者不能建图,那么修改二分边界 上代码,觉得最小树形图的代码很优美 /* 题意:给定n个点, ...

  3. bzoj 1222

    比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可 本题卡空间,需要滚动数组优化 本题卡时间,稍微卡下常就行 #inc ...

  4. Java将文件中的内容转换为sql语句(和并发定时读取文件)

    数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...

  5. spring coud Feign常用配置

    Ribbon配置 在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如: # 设置连接超时时间 ribbon.ConnectTimeout=500 ...

  6. jexus linux x64 [专业版] 安装和配置https

    一.环境 操作系统:centOs7-x64 二.准备工作 购买SSL/TLS证书 三.部署 1.首先查看“/lib”或“/usr/lib”等系统库文件夹中是否有SSL库文件的名字,该文件名应该是“li ...

  7. 一脸懵逼学习Hadoop-HA机制(以及HA机制的配置文件,测试)

    1:能否让两个NameNode都正常影响客户端请求? 应该让两个NameNode节点在某个时间只能有一个节点正常影响客户端请求,相应请求的必须为Active状态的那一台. 2:standBy状态的节点 ...

  8. Windows Phone MultiBinding :Cimbalino Toolkit

    在WPF和WIN8中是支持MultiBinding 这个有啥用呢,引用下MSDN的例子http://msdn.microsoft.com/en-us/library/system.windows.da ...

  9. Redis-Sentinel 哨兵

    为什么需要哨兵? 一旦主节点宕机,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点 那么这个问题,redis-sentinel就可以解决了 什么是 ...

  10. 【CF666E】Forensic Examination

    题解: 熟练掌握了后缀自动机后大部分题目应该都比较容易想 首先对t建立广义后缀自动机 然后我们可以用线段树合并处理出每个点每个串出现的次数,然后求出最大值 匹配的时候比较巧妙 我们离线处理 对于同一个 ...