传送门

这一题是真的坑人,时间空间都在鼓励你用 $NTT$ 优化 $dp$...(但是我并不会 $NTT$)

看到题目然后考虑树形 $dp$ ,设 $f[i][0/1]$ 表示 $i$ 个节点的树,根节点为奇数/偶数的方案数

然后发现对于 $f[i][0/1]$ 的所有方案,把节点编号同时加一个偶数后根节点奇偶性不变,把节点编号加一个奇数后根节点的奇偶性变了

那么就可以对每个 $f[i][0/1]$ 枚举左右子树转移了,因为确定总点数所以左子树点数就有一个范围,在那个范围内枚举子树大小 $j$

那么有转移 $f[i][0]=\sum f[j][1] \cdot f[i-j-1][1]$ ,$f[i][1]=\sum f[j][0] \cdot f[i-j-1][1]$

然后发现转移是卷积的形式,然后据说就可以 $NTT$ 优化什么的...但是我完全不会诶

然后推完发现并没有什么用就去看看神仙的提交记录(比赛的时候是可以看别人的提交结果的)

然后你感到一丝不妙,那些人怎么都是几十毫秒过的???再看看空间发现有些人甚至 $0kb$ ???

于是你赶紧把暴力打完把表打出来,发现大部分状态都是 $0$ ,只有少部分的结果是 $1$

然后你再输出一下方案为 $1$ 的各种状态,发现只有当节点数为 $1,2,4,5,9,10,20,21,41,42,84,85...$

然后就发现了规律,然后你就成功通过了这一题(当然那时我并没有过)

所以现在考虑一下怎么去证明这个东西,首先对于 $3$ 层的这种树只有当点数为 $4,5$ 时可以发现有唯一一种方案

首先显然的,对于这种树的根节点,它的左右儿子子树也必须是这种树

然后注意到对于 $n$ 个节点的这种树,根节点和 $n$ 号节点奇偶性相同(因为二叉搜索树的性质,$n$ 号节点必须是最右边的)

所以根节点的右子树的子树大小必定为偶数

然后又因为左右子树的深度必须一样,所以比 $4,5$ 个节点的这种树 多一层的这种树,它的左右儿子必须是 $4$ 或 $5$ 个节点

又因为之前证明的右儿子必须为偶数,那么多一层的这种树只有左儿子为 $4$ 右儿子为 $4$ ,和左儿子为 $5$ 右儿子为 $4$ 两种方案

那么每一层都只能靠少一层的那两种子树得到新的那两种树,所以证明完毕

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e6+;
int n;
int main()
{
n=read();
int now=;
while(now<=n)
{
if(now==n || now+==n) { printf("1\n"); return ; }
if(now&) now=(now+)++now;
else now=now++now;
}
printf("0\n");
return ;
}

Codeforces 1237E. Balanced Binary Search Trees的更多相关文章

  1. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  2. CF1237E 【Balanced Binary Search Trees】

    首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(N\)相同 然后我们发现对于一个完美树,他的左右两个儿子都是完美树 也就是说,一颗完美树是由两棵完美树拼成的 注意到另一个性 ...

  3. Codeforces 1237E Perfect Balanced Binary Search Tree

    题目链接 Observations 含有 $n$ 个点且 key(以下也称 key 为「权值」)是 1 到 $n$ 的 BST 具有下列性质: 若 $k$ 是一个非根叶子且是个左儿子,则 $k$ 的父 ...

  4. 并不对劲的CF1237D&E:Balanced Playlist and Binary Search Trees

    CF1237D Balanced Playlist 题意 有一个长度为\(n\)(\(n\leq 10^5\))的循环播放歌单,每首歌有一个优秀值\(a_i\)(\(a_i\leq 10^9\)). ...

  5. Method for balancing binary search trees

    Method for balancing a binary search tree. A computer implemented method for balancing a binary sear ...

  6. Optimal binary search trees

    问题 该问题的实际应用 Suppose that we are designing a program to translate text from English to French. For ea ...

  7. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  8. [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  9. 2 Unique Binary Search Trees II_Leetcode

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

随机推荐

  1. Android学习_MVC与Adapter

    一.           MVC模式 MVC模式代表Model-View-Controller(模型-视图-控制器)模式.这种模式用于应用程序的分层开发. Model(模型):代表一个存取数据的对象或 ...

  2. javascript中的类型转换,宽松相等于严格相等

    为了将值转换为基本类型值(string,number,boolean,null,undefined),抽象操作ToPrimitive会首先检查该值有没有valueOf()方法,如果有并且返回基本类型值 ...

  3. CSS-居中方法汇总

    CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案汇编整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来. 水平居中 ...

  4. Leetcode题目279.完全平方数(动态规划-中等)

    题目描述: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解 ...

  5. WIN7系统TortoiseSVN右键没有菜单解决办法

    TortoiseSVN右键菜单不显示解决办法,亲测有效.其他操作系统解决办法类似,如有问题,给我留言. 百度经验:jingyan.baidu.com 工具/原料   TortoiseSVN 百度经验: ...

  6. LNMP和LAMP的搭建

    LNMP 环境:阿里云ubuntu 16 mysql: apt-get install mysql-server mysql-client php: apt-get install php-fpm p ...

  7. 8 HashMap

    1.Map接口 public interface Map<K, V> 将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射到一个值. 具体的实现:HashMap,TreeMap, ...

  8. koa 项目实战(十)使用 validator 验证表单

    1.安装模块 npm install validator -D 2.验证注册参数 根目录/validation/register.js const Validator = require('valid ...

  9. ubuntu下如何使用dpkg删除某个软件包?

    答:步骤如下: 1. 找出包名 dpkg -l |grep <package name> 2. 卸载 dpkg -r <package name>

  10. LC 781. Rabbits in Forest

    In a forest, each rabbit has some color. Some subset of rabbits (possibly all of them) tell you how ...