Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\)
Link.
定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当:
除去最深的所有叶子后,\(T\) 是满的;
对于 \(T\) 中任意结点 \(r\),若 \(r\) 存在左儿子 \(u\),则 \(r\not\equiv u\pmod2\);
若 \(r\) 存在右儿子 \(v\),则 \(r\equiv v\pmod2\);
给定 \(n\),求 好树 数量。答案对 \(998244353\) 取模。
\(\require{cancel} \cancel{n\le10^6}~n\le10^{10^6}\)。
\(\mathcal{Solution}\)
分析一下含有 \(n\) 个结点的 好树 的性质:
好树 的子树是 好树。
树根 \(r\) 有 \(r\equiv n\pmod2\)。因为从根一直走右儿子奇偶性不变。
当 \(n>1\),好树 不满。若满,最大值和次大值必为右儿子-父亲关系,不满足定义。
由 3.,当 \(n>2\),好树 树根的左右子树的最大满层相同。
我们这样断言:最大满层深度为 \(h\) 的 好树 存在且仅存在两个,且它们的大小之差为 \(1\)。
给出证明。设含 \(n\) 个结点的 好树 有 \(f(n)\) 个,那么 \(f(1)=f(2)=1\),它们最大满层深度均为 \(1\)。归纳 \(n>2\) 的情形:
取一棵含 \(n\) 个点的 好树 \(T\),其树根为 \(r\),左右儿子为 \(u,v\),最大满层深度为 \(h\)。
由性质 1.,子树 \(u\) 和子树 \(v\) 是好树;
由性质 3.,子树 \(u\) 和子树 \(v\) 不满;
由假设,\(T\) 为好树,子树 \(u\) 和子树 \(v\) 最大满层相同。那么可以对这两棵子树进行归纳。
若 \(2\not\mid n\),
可知子树 \(u\),子树 \(v\) 大小奇偶性相同,由性质 4. 与归纳假设,子树 \(u\) 和子树 \(v\) 的大小相等,且均为偶数,继而有\[ f(n)=f^2\left(\frac{n-1}{2}\right)~~~~(n=4k+1,k\in\mathbb N^*).
\]若 \(2\mid n\),
可知子树 \(u\),子树 \(v\) 大小奇偶性不同,由归纳假设,子树 \(u\) 和子树 \(v\) 大小相差 \(1\),继而有\[ f(n)=f\left(\frac{n}{2}-1\right)f\left(\frac{n}{2}\right).
\](注意左右子树不能交换,所以只有一种放法。)
综上,不难发现 \(f(n)\) 在归纳条件下至多为 \(1\)。我们只需要证明存在某对使得 \(T\) 最大满层深度为 \(h\) 的 \(n_0\) 和 \(n_0+1\),使得 \(f(n_0)=f(n_0+1)=1\)。
构造,设当 \(h'=h-1\) 时已有 \(f(n_0')=f(n_0'+1)=1\),那么
若 \(2\mid n_0\),有 \(f(2n_0)=f(2n_0+1)=1\);
若 \(2\not\mid n_0\),有 \(f(2n_0+2)=f(2n_0+1)=1\)。
综上,归纳可行,原命题成立。 \(\square\)
利用最后一步的构造方法,我们可以 \(\mathcal O(\log n)\) 地求得所有 \(n_0\le n,f(n_0)=1\) 的 \(n_0\)。当然也能以同样复杂度判断 \(f(n)\) 是否为 \(1\)。
正确解题姿势:写 \(\mathcal O(n^2)\) DP,打表秒出规律。
\(\mathcal{Code}\)
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;
}
Solution -「CF 1237E」Balanced Binary Search Trees的更多相关文章
- Codeforces 1237E Perfect Balanced Binary Search Tree
题目链接 Observations 含有 $n$ 个点且 key(以下也称 key 为「权值」)是 1 到 $n$ 的 BST 具有下列性质: 若 $k$ 是一个非根叶子且是个左儿子,则 $k$ 的父 ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
随机推荐
- vue 图片拖拽和滚轮缩放
这里注意如果自己的页面有滚动条,一定阻止滚动事件的默认行为,否则缩放图片的时候,页面会跟着滚动@mousewheel.prevent 阻止默认行为 <div ref="imgWrap& ...
- Web开发之HTTP协议
HTTP响应消息 一个HTTP响应代表服务器向客户端回送的数据. 一个完整的HTTP响应包括如下内容: 一个状态行.若干消息头.以及响应正文,其中的一些消息头和正文都是可选的,消息头和正文内容之间要用 ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- java继承成员函数特点
1 //成员函数. 2 /* 3 * 当子父类中出现成员函数一模一样的情况,会运行子类的函数. 4 * 这种现象,称为覆盖操作.这时函数在子父类中的特性. 5 * 函数两个特征: 6 * 1,重载. ...
- linux设置系统用户密码
目录 一:系统用户密码 1.设置用户密码 一:系统用户密码 1.设置用户密码 1.交互式方法 passwd [用户名] 2.免交互式 echo [设置密码] | passwd --stdin [用户名 ...
- Power Apps 创建响应式布局
前言 我们都知道Power Apps作为低代码平台,最大的优势就是各个设备之间的兼容性,尤其是自带的响应式布局,非常好用. 这不,我们就为大家分享一下,如何使用Power Apps画布应用,创建响应式 ...
- 学习JAVAWEB第十天
今天内容: 运行servlet到崩溃,一直是404 明天继续运行
- JavaScript之原型链与原型链继承
原型链 定义:每个实例对象(object)都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype).该原型对象也有一个自己的原型对象(__proto__),层层 ...
- 计算机网络再次整理————tcp例子[五]
前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...
- AT2689 [ARC080D] Prime Flip
简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...