题解:CF1237E Balanced Binary Search Trees
对 https://www.luogu.com.cn/article/fd9qi7ie 的一些补充。
step1:容易发现根的奇偶性和
step2:一颗合法的树,满足根的左右子树也是合法的树。
step3:
step4:一个合法的树,根的左右子树也都是合法的树。
考虑两个合法的树合并为一个合法的树。
题目中要求每个点到根的距离的和最小,也就是树是一颗满二叉树在最后一层删除一些点得到。所以那两个合法的树必须高度相同为
设
接下来需要证明深度为
- 对于
i=3 成立(暴推验证)。设根左子树大小为L ,根右子树大小为R 。 -
顺便也得出了转移式
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int n, f[30];
int main(){
cin >> n;
if(n == 1 || n == 2 || n == 4 || n == 5){
cout << 1;
return 0;
}else if(n == 3){
cout << 0;
return 0;
}
f[3] = 4;
for(int i = 4; i <= 25; i++){
f[i] = 2 * f[i - 1] + 1 + (f[i - 1] % 2 == 1);
if(f[i] == n || f[i] + 1 == n){
cout << 1;
return 0;
}
}
cout << 0;
return 0;
}