传送门
思路:
很有意思的一道题
DP思路十分显然,我们以最小值为例
f[x][h][0/1]表示节点数为x的子树,该树的黑高度为h,根节点颜色为红/黑时
f[x][h][0]=min{f[y][h][1]+f[x−y−1][h][1]}+1f[x][h][0]=\min\{f[y][h][1]+f[x-y-1][h][1]\}+1
f[x][h][1]=min{f[y][h−1][0/1]+f[x−y−1][h−1][0/1]}f[x][h][1]=\min\{f[y][h-1][0/1]+f[x-y-1][h-1][0/1]\}
0≤y<x0\leq y
复杂度是O(n3)O(n^3)的,一开始并没有想到怎么优化
看看只输入一个数。。。打表!
但是跑得太慢了,所以就把前100的答案拿出来观察一番
瞪眼观察了半天后,发现最大值g[n]g[n]有这样的规律
当n=2kn=2^k时
g[n]=g[n−1]−⌈k2⌉+1g[n]=g[n-1]-\lceil \frac k 2 \rceil+1
当n=2k⋅s(s>1)n=2^k·s(s>1)时
g[n]=g[n−1]−⌊k−12⌋g[n]=g[n-1]-\lfloor \frac {k-1} 2\rfloor
最小值没(lan)有(de)看(kan)出(le),翻了一下OEIS(啪),发现是catalan数每一项的2的幂指数
表示奥妙重重而且不会证明反正是对的就行了
(这里我还推错了几次,有一次竟然A了,发现数据规模很小,感人至深)

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
int f[5005],g[5005],bit[20005];
main()
{ios::sync_with_stdio(0); cin>>n;g[1]=1;bit[1]=0;for (int i=2;i<=4*n;++i)if (i%2==0) bit[i]=bit[i/2]+1;else bit[i]=0;f[1]=0;for (int i=2;i<=n;++i){int t=bit[i&-i];if (i^(i&-i))g[i]=g[i-1]-t/2+1;elseg[i]=g[i-1]-(t-1)/2;f[i]=f[i-1]+bit[4*i-2]-bit[i+1];}printf("%d\n%d\n",f[n],g[n]);
}

我们返回来看原先的DP式子
虽然不会写红黑树,但我们还是很容易感受出来一颗红黑树是不会很长的,它的节点分布一定很平均
实际上,一颗黑高度为hh的红黑树,它的内节点数至少为2h−12^{h}-1(比较显然,只要所有节点都是黑节点就可以了),那也就是说对于一颗节点数为xx的红黑树,它的深度不超过⌊log2(x+1)⌋\lfloor \log_2(x+1)\rfloor,所以我们DP时枚举黑高度的次数由O(n)O(n)减小到了O(logn)O(\log n)!,复杂度O(n2logn)O(n^2\log n),表示这个复杂度在本机上很难过,不过codevs上好像跑的还挺快?
反正xjb优化了一些东西后,本机跑n=5000终于能进2s了

#include<cstring>
#include<cstdio>
using namespace std;
int n;
int f[5005][17][2],g[5005][17][2];
inline int min(int x,int y){return x>y?y:x;}
inline int max(int x,int y){return x>y?x:y;}
main()
{scanf("%d",&n);memset(f,63,sizeof(f));memset(g,-63,sizeof(g));f[0][1][1]=0;g[0][1][1]=0;for (int i=1;i<=n;++i)for (int j=1;(1<<j-1)<=n+1&&j<=i+1;++j)for (int k=(j>1?(1<<j-2)-1:0);k<=i-k-1;++k){f[i][j][0]=min(f[i][j][0],f[k][j][1]+f[i-k-1][j][1]+1);g[i][j][0]=max(g[i][j][0],g[k][j][1]+g[i-k-1][j][1]+1);if (j>1)f[i][j][1]=min(f[i][j][1],min(f[k][j-1][1],f[k][j-1][0])+min(f[i-k-1][j-1][0],f[i-k-1][j-1][1])),g[i][j][1]=max(g[i][j][1],max(g[k][j-1][1],g[k][j-1][0])+max(g[i-k-1][j-1][0],g[i-k-1][j-1][1]));}int mi=10000,mx=0;for (int i=1;(1<<i-1)<=n+1;++i)mi=min(mi,min(f[n][i][0],f[n][i][1])),mx=max(mx,max(g[n][i][0],g[n][i][1]));printf("%d\n%d\n",mi,mx);
}

百度一下并没有我起初打表递推的做法,主要是DP和贪心?贪心!
贪心做法很劲的样子,表示吓哭

【BZOJ3227】红黑树,打表找规律/DP相关推荐

  1. paulzhou的数学?TAT? 【二分打表找规律】

    paulzhou的数学?TAT? Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Tota ...

  2. CodeForces - Insertion Sort(打表找规律)

    题目链接:http://codeforces.com/gym/101955/problem/C Time limit:6.0 s Memory limit:1024 MB Problem Descri ...

  3. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  4. Yet Another Meme Problem(打表找规律)

    Try guessing the statement from this picture http://tiny.cc/ogyoiz. You are given two integers AA an ...

  5. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?

    B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...

  6. hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j's Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...

  7. D. Pythagorean Triples(1487D)(打表找规律 + 二分)

    D. Pythagorean Triples(1487D)(打表找规律 + 二分) 题目来源:D. Pythagorean Triples 题意: 给定一个 n,求满足以下条件的数对 (a, b, c ...

  8. Ural 2045. Richness of words 打表找规律

    2045. Richness of words 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2045 Description For ...

  9. Ural 2037. Richness of binary words 打表找规律 构造

    2037. Richness of binary words 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2037 Descripti ...

最新文章

  1. CentOS下用yum管理软件的好处
  2. 第六周实践作业:软件测试和评估
  3. vscode技巧、vscode教程、vscode使用技巧
  4. 大工20春《计算机文化基础》在线测试3,大工20春《计算机文化基础》在线测试3题目【标准答案】...
  5. shell 中scp 和 ssh密码输入 --expect (转:http://blog.sina.com.cn/s/blog_8ad7d4ca01014lft.html)
  6. BASIC-2 01字串
  7. .NET开发框架(二)-框架功能简述
  8. Python 线程(二):简单锁实现线程同步
  9. linux下mycat测试安装
  10. ESP32使用Arduino环境,安装、编译、下载、安装库
  11. MariaDB一之编译安装MariaDB、MariaDB初始化及MariaDB的图形化工具
  12. Linux 性能测试与分析-转
  13. python找重复元素_Python笔记(二)查找重复元素
  14. 五、应用程序与驱动程序交互(缓冲模式)
  15. d3力导向图增加节点_在D3力导向图中突出显示所选节点,其链接及其子节点
  16. android 蓝光过滤,蓝光过滤app最新版
  17. 我们如何获取信息,组织知识
  18. ESP8266 烧写选项 Flash Size 32M和32M-c1的区别
  19. python编写sql注入工具毕业设计_Python编写SQL注入工具(2)
  20. 学会保护自己的眼睛!

热门文章

  1. 野生前端的数据结构基础练习(2)——队列
  2. ngnix 执行php 慢,【nginx】PHP有什么办法可以排查那些脚本或方法执行慢,需要优化?...
  3. php 不能运行,PHP 环境不能正常运行
  4. 【李宏毅机器学习】backpropagation 反向传播(p13) 学习笔记
  5. android gradle 1.5.0,Cordova build – 无法解析com.android.tools.build:gradle:1.5.0
  6. java swing 实现下拉列表点击事件
  7. Java多线程实现多客户端的通信
  8. 小智伴机器人使用说明_智伴机器人丨史上最全功能,玩转小智伴看这里!
  9. golang 读取本机唯一码_UDI医疗器械唯一标识系统,您身边的UDI专家
  10. 24c04硬件地址位_硬件刷题篇(一)