Solution -「CF 1237E」Balanced Binary Search Trees
Link.
定义棵点权为 的二叉搜索树 是 好树,当且仅当:
-
除去最深的所有叶子后, 是满的;
-
对于 中任意结点 ,若 存在左儿子 ,则 ;
-
若 存在右儿子 ,则 ;
给定 ,求 好树 数量。答案对 取模。
。
分析一下含有 个结点的 好树 的性质:
-
好树 的子树是 好树。
-
树根 有 。因为从根一直走右儿子奇偶性不变。
-
当 ,好树 不满。若满,最大值和次大值必为右儿子-父亲关系,不满足定义。
-
由 3.,当 ,好树 树根的左右子树的最大满层相同。
我们这样断言:最大满层深度为 的 好树 存在且仅存在两个,且它们的大小之差为 。
给出证明。设含 个结点的 好树 有 个,那么 ,它们最大满层深度均为 。归纳 的情形:
取一棵含 个点的 好树 ,其树根为 ,左右儿子为 ,最大满层深度为 。
由性质 1.,子树 和子树 是好树;
由性质 3.,子树 和子树 不满;
由假设, 为好树,子树 和子树 最大满层相同。那么可以对这两棵子树进行归纳。
-
若 ,
可知子树 ,子树 大小奇偶性相同,由性质 4. 与归纳假设,子树 和子树 的大小相等,且均为偶数,继而有 -
若 ,
可知子树 ,子树 大小奇偶性不同,由归纳假设,子树 和子树 大小相差 ,继而有(注意左右子树不能交换,所以只有一种放法。)
综上,不难发现 在归纳条件下至多为 。我们只需要证明存在某对使得 最大满层深度为 的 和 ,使得 。
构造,设当 时已有 ,那么
-
若 ,有 ;
-
若 ,有 。
综上,归纳可行,原命题成立。
利用最后一步的构造方法,我们可以 地求得所有 的 。当然也能以同样复杂度判断 是否为 。
正确解题姿势:写 DP,打表秒出规律。
Subtask12
即打表代码。
/*~Rainybunny~*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
const int MAXN = 5e6;
int n, M;
bool ans[MAXN + 5];
inline int imin( const int u, const int v ) { return u < v ? u : v; }
inline int imax( const int u, const int v ) { return u < v ? v : u; }
inline int mul( const int u, const int v ) { return 1ll * u * v % M; }
inline void addeq( int& u, const int v ) { ( u += v ) >= M && ( u -= M ); }
namespace Subtask12 {
int bitw[MAXN + 5], f[MAXN + 5];
inline void main() {
f[0] = f[1] = 1, bitw[0] = -1;
rep ( i, 2, n ) {
bitw[i] = bitw[i >> 1] + 1;
rep ( j, 1, i ) {
if ( ( i & 1 ) == ( j & 1 )
&& imin( bitw[j], bitw[i - j + 1] ) + 1 >= bitw[i]
&& imax( bitw[j - 1], bitw[i - j] ) + 1 == bitw[i] ) {
// printf( "(%d,%d)->%d\n", j - 1, i - j, i );
addeq( f[i], mul( f[j - 1], f[i - j] ) );
}
}
if ( f[i] ) assert( f[i] == 1 ), printf( "%d\n", i );
}
}
} // namespace Subtask12.
int main() {
freopen( "tree.in", "r", stdin );
freopen( "tree.out", "w", stdout );
scanf( "%d %d", &n, &M );
for ( int i = 2, op = 1; i <= MAXN + 1; ) {
ans[i] = ans[i - 1] = true;
i = i << 1 | op, op ^= 1;
}
putchar( ans[n] ^ '0' ), putchar( '\n' );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现