CF1237E 【Balanced Binary Search Trees】
首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(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】的更多相关文章
- 【Unique Binary Search Trees】cpp
题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...
- 【二叉查找树】01不同的二叉查找树的个数【Unique Binary Search Trees】
当数组为1,2,3,4,...,n时,基于以下原则构建的BST树具有唯一性: 以i为根节点的树,其左子树由[1,i-1]构成,其右子树由[i+1, n]构成. 我们假定f(i)为以[1,i]能产生的U ...
- 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】
[096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...
- 【Unique Binary Search Trees II】cpp
题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...
- 【二叉查找树】02不同的二叉查找树个数II【Unique Binary Search Trees II】
提到二叉查找树,就得想到二叉查找树的递归定义, 左子树的节点值都小于根节点,右子树的节点值都大于根节点. +++++++++++++++++++++++++++++++++++++++++++++++ ...
- 【Validate Binary Search Tree】cpp
题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...
- 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】
本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 【Recover Binary Search Tree】cpp
题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...
- 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】
开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...
随机推荐
- 关于elasticsearch使用G1垃圾回收替换CMS
最近ES集群数据节点经常出现jvm占用过高,频繁GC导致ES集群卡死,很长时间才恢复.在网上看到用G1垃圾回收可以改善这一情况,但都是老版本的ES,我们现在使用的版本是5.5.2,所以想问问各位5.5 ...
- .net core 读取、修改配置文件appsettings.json
.net core 设置读取JSON配置文件 appsettings.json Startup.cs 中 public class Startup { public Startup(IHostingE ...
- Vert.x 异步访问数据库 MySQL
Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的 ...
- AWS成本估算的相关小工具
1.AWS-partner :云势数据做的在线小工具,有微信版本可以使用,但是涉及的服务很少,更新慢,型号缺,界面不友好.不是很理想,连接如下: https://www.goclouds.cn ...
- AngularJS $http用法总结
最近由于项目需要,在研究AngularJS $http的用法,查了很多资料,发现貌似没有一篇内容可以完整的满足我对$http的基本了解,为了下次方便自己查找,所以特意把最近查到的一些资料和自己的理解记 ...
- html 随机验证码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- tcp、udp协议栈
tcp struct tcphdr { __be16 source; //源端口 __be16 dest; //目的端口 __be32 seq; //序列号 __be32 ack_seq; //确认号 ...
- Android-----Intent通过startActivityForResult(Intent intent , int 标志符)启动新的Activity
我们都了解使用 startActivity(intent) 新的activity只能传递数据,却无法返回数据,返回新activity返回的数据我们可以替换startActivityForResult( ...
- 软工作业 wc-java
项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...
- Mac版StarUML破解方法
StarUML是用nodejs写的.确切的说是用Electron前端框架写的.新版本中所有的starUML源代码是通过asar工具打包而成.确切的代码位置在“%LOCALAPPDATA%\Progra ...