BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
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 思路)相关推荐
- 2021牛客多校4 - Rebuild Tree(树形dp)
题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...
- 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: ...
- 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 ...
- 【bzoj 1812】[Ioi2005]riv(树形dp)
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 433 Solved: 246 [Submit][Status] ...
- LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP
题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...
- Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp
链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...
- VK Cup 2012 Round 1 D. Distance in Tree (树形dp)
题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...
- ARC101E Ribbons on Tree 树形dp 容斥
题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...
- bzoj 3162: 独钓寒江雪 树哈希+树形dp
题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...
最新文章
- Rancher-创建自己的应用商店教程
- 五:二叉树中和为某一直的路径
- Android开发常用轮子
- java 连接ldap_ldap java 连接demo
- 拷贝 var lib mysql 备份_mysql复制与备份
- Casper Labs成为数据隐私协议联盟的创始成员
- html中抓取span中的值,JavaScript如何获取span元素的文本?
- 如何使用迅雷下载电骡的资源
- 【LA4728】Square(求凸包(多边形)直径----旋转卡壳)
- 全国一级计算机考什么,全国计算机等级考试一级考什么
- 教你免费使用刷脸支付设备,蜻蜓二代返还政策解析
- gflags使用详解
- html标签加载状态,如何让html页面数据没有加载完前显示loading加载中
- Windows Mobile 6.1模拟器发布,欢迎下载!
- Visual Studio 2019背景美化(背景透明化+自定义背景图片)
- 外卖店优先级 第十届蓝桥杯真题 C++
- RANSAC算法实现图像全景拼接
- 几代数字无线通信系统标准汇总
- 云原生CI/CD:tekton/pipeline之认证篇
- 终端 删除php文件内容,Mac_mac命令行终端可以卸载吗?mac命令行终端卸载软件教程, mac os系统卸载软件方式有 - phpStudy...
热门文章
- 3. std::string::size_type
- Java 找平方数之和的奇数
- C++ 设计员工类(Employee)
- php ajax轮询推送,[PHP]PHP+AJAX实现轮询代码
- 【面试题】Redis中是如何实现分布式锁的
- ThinkPHP开发中遇到的小坑
- Java基础:多线程
- How draw a stem -and -leaf amp; box-plot display by R.or Python
- POJ C++程序设计 编程题#4:计算整数平方和
- 各排序算法的C++实现与性能测试(转)