首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(N\)相同

然后我们发现对于一个完美树,他的左右两个儿子都是完美树

也就是说,一颗完美树是由两棵完美树拼成的

注意到另一个性质:由于权值是一个排列,假设根节点为\(x\),那么左子树的范围是\([1, x - 1]\),右子树为\([x + 1, n]\)

由于根节点和\(N\)奇偶性相同,那么左子树的大小与\(N\)的奇偶性相反,所以右子树大小为偶数

如果子树区间为\([l, r]\),那么其实可以把它看成\([1, r - l + 1]\),所以只和子树大小有关,和子树权值无关

手玩一波小数据:

当\(N=1\)时,就是一个点

当\(N=2\)时,二为根,一为根的左子树

当\(N=3/4\)时为样例

当\(N=5\)时,可以用两个2的子树拼成

然后我们发现,能作为右子树的只有\(2/4\),前五个都不是满二叉树,所以我们可以合并两颗树,当且仅当两个二叉树高度相同

发现2的高度为2,没有与之相同树高的树,所以能作为右子树的只有\(4\)

所以我们就有:用\(4/5\)可以凑出\(9/10\),\(9/10\)又可以拼出\(19/20\)……

所以我们就可以用\(4/5\)一路递推下去,发现每次都*了\(2\),所以复杂度为\(O(logN)\)

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, x = 4, y = 5;
scanf("%d", &n);
if(n == 1 || n == 2) return puts("1"), 0;
while(y < n) {
if(x & 1) x = 2 * y, y = x + 1;
else x = 2 * y - 1, y = x + 1;
}
return printf("%d", (x == n || y == n)), 0;
}

CF1237E 【Balanced Binary Search Trees】的更多相关文章

  1. 【Unique Binary Search Trees】cpp

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

  2. 【二叉查找树】01不同的二叉查找树的个数【Unique Binary Search Trees】

    当数组为1,2,3,4,...,n时,基于以下原则构建的BST树具有唯一性: 以i为根节点的树,其左子树由[1,i-1]构成,其右子树由[i+1, n]构成. 我们假定f(i)为以[1,i]能产生的U ...

  3. 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】

    [096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...

  4. 【Unique Binary Search Trees II】cpp

    题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...

  5. 【二叉查找树】02不同的二叉查找树个数II【Unique Binary Search Trees II】

    提到二叉查找树,就得想到二叉查找树的递归定义, 左子树的节点值都小于根节点,右子树的节点值都大于根节点. +++++++++++++++++++++++++++++++++++++++++++++++ ...

  6. 【Validate Binary Search Tree】cpp

    题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...

  7. 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】

    本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  8. 【Recover Binary Search Tree】cpp

    题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...

  9. 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】

    开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...

随机推荐

  1. 属性动画 补间动画 帧动画 基本使用案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

    原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...

  3. 华为交换机配置Telnet步骤

    通过Telnet方式登录交换机进行设备查询管理为各网络管理员提供了便利,不需要成天拎着console线夹着笔记本蹲在机房里,只要在能连接到相应网络的电脑上Telnet连接即可. 前提条件是该交换机已经 ...

  4. SpringBoot开发验证码功能

    简介 验证码主要是用来防止恶意破解密码.刷票.论坛灌水.刷页.Kaptcha 是一个可高度配置的实用验证码生成工具,使用也很简单,这里就使用它来做验证码. 另外使用JAVA原生的API也可以实现验证码 ...

  5. activiti用户手册

    http://www.mossle.com/docs/activiti/index.html

  6. springCloud学习4(Zuul服务路由)

    镇博图 springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本篇中 Zuul 版本为 1.x,目前最新的是 2.x,二者 ...

  7. JavaScript: 数据类型检测

    由于JavaScript是门松散类型语言,定义变量时没有类型标识信息,并且在运行期可以动态更改其类型,所以一个变量的类型在运行期是不可预测的,因此,数据类型检测在开发当中就成为一个必须要了解和掌握的知 ...

  8. ubifs使用方法

    常用命令: 查看块设备分区信息cat /proc/mtd 查看块设备信息mtdinfo /dev/mtd0 格式化mtd分区ubiformat /dev/mtd0 将mtd分区与ubi关联ubiatt ...

  9. cmdb资产管理2

    新增资产 现在api服务端已经能获取到我们要做的操作了.接下来应该是补充获取操作后对应的程序编写 我们要做的是把post请求发过来的数据保存到数据库.我们创建repository 名字的app,并设计 ...

  10. Mysql【第一课】