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得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...
随机推荐
- 【Maven基础入门】02 了解POM文件构建
温故 上一节我们说过:Maven 是一个基于POM文件的构建工具,当然离不开POM文件 POM文件是一个XML标记语言表示的文件,文件就是:pom.xml 一个POM文件包含了项目的基本信息,用于描述 ...
- 接口的鉴权cookie、session和token
1.HTTP是无状态协议 什么是无状态?就是说这一次的请求和上一次的请求是没有任何关系的,无法共享信息.好处就是速度快. 2.cookie.session的加入 HTTP请求是无状态的,所以解决共享信 ...
- 服务注册发现(一) Consul 简介及 windows版本的安装与部署
Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的 ...
- python day 14: 作业:开发一个能够多用户上传文件的FTP脚本
目录 python day 14 1. 要求 2. 自己写的程序目录 3. models模块 4. settings模块 5. tcp_server模块 6. client模块 7. 后记 pytho ...
- python学习之os模块
1 window下的路径分隔符和mac上的一样吗 在win下用\做路径分隔符,mac里用/ 2.如何查看当前工作目录 import os os.getcwd() 3.如何切换当前工作目录 import ...
- tcp校验和
伪首部(pseudo header),通常指TCP伪首部和UDP伪首部 TCP的校验和是必需的,而UDP的校验和是可选的 TCP校验是需要校验包头和数据的 //共12字节 typedef struct ...
- C#创建DataTable(转载)
来源:https://www.cnblogs.com/xietianjiao/p/11213121.html方法一: DataTable tblDatas = new DataTable(" ...
- appium自动化webview时遇到的chromedriver问题
安卓app里面的网页,基本上都是使用手机系统上的webview 去显示的. 安卓 webview 可以看成是 手机上的 chrome 浏览器精简版. appium desktop 里面内置了 用于 w ...
- HTTPS安全通信过程
前言:本文是的第三篇文章.第一篇文章<常见加密算法特点及适用场景>,介绍了常见加密算法及其适用的场景,对加密算法做一个总体的概述.第二篇文章<非对称加密算法-RSA算法&g ...
- 【linux-command】Chrome安装linux-command插件
一.linux-command是什么 550 多个 Linux 命令,内容包含 Linux 命令手册.详解.学习,值得收藏的 Linux 命令速查手册.Githb地址: https://github. ...