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*2case 1: ans+=(x>>1)-1, x>>=2, ++x; break;// /4*2-1case 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;
}

转载于:https://www.cnblogs.com/SovietPower/p/10512932.html

BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)相关推荐

  1. 2021牛客多校4 - Rebuild Tree(树形dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...

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

  3. HDU 5834 Magic boy Bi Luo with his excited tree 树形DP

    Magic boy Bi Luo with his excited tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 Descript ...

  4. 【bzoj 1812】[Ioi2005]riv(树形dp)

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 433  Solved: 246 [Submit][Status] ...

  5. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  7. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...

  8. ARC101E Ribbons on Tree 树形dp 容斥

    题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n​个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...

  9. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

最新文章

  1. Rancher-创建自己的应用商店教程
  2. 五:二叉树中和为某一直的路径
  3. Android开发常用轮子
  4. java 连接ldap_ldap java 连接demo
  5. 拷贝 var lib mysql 备份_mysql复制与备份
  6. Casper Labs成为数据隐私协议联盟的创始成员
  7. html中抓取span中的值,JavaScript如何获取span元素的文本?
  8. 如何使用迅雷下载电骡的资源
  9. 【LA4728】Square(求凸包(多边形)直径----旋转卡壳)
  10. 全国一级计算机考什么,全国计算机等级考试一级考什么
  11. 教你免费使用刷脸支付设备,蜻蜓二代返还政策解析
  12. gflags使用详解
  13. html标签加载状态,如何让html页面数据没有加载完前显示loading加载中
  14. Windows Mobile 6.1模拟器发布,欢迎下载!
  15. Visual Studio 2019背景美化(背景透明化+自定义背景图片)
  16. 外卖店优先级 第十届蓝桥杯真题 C++
  17. RANSAC算法实现图像全景拼接
  18. 几代数字无线通信系统标准汇总
  19. 云原生CI/CD:tekton/pipeline之认证篇
  20. 终端 删除php文件内容,Mac_mac命令行终端可以卸载吗?mac命令行终端卸载软件教程,  mac os系统卸载软件方式有 - phpStudy...

热门文章

  1. 3. std::string::size_type
  2. Java 找平方数之和的奇数
  3. C++ 设计员工类(Employee)
  4. php ajax轮询推送,[PHP]PHP+AJAX实现轮询代码
  5. 【面试题】Redis中是如何实现分布式锁的
  6. ThinkPHP开发中遇到的小坑
  7. Java基础:多线程
  8. How draw a stem -and -leaf amp; box-plot display by R.or Python
  9. POJ C++程序设计 编程题#4:计算整数平方和
  10. 各排序算法的C++实现与性能测试(转)