题目大意:

一个树是FIBFIBFIB树得是节点个数为斐波那契数且(注意这个且)!!此外满足下面条件一个:

1.只有一个点
2.可以切一条边使得分出的两个子树都是FIBFIBFIB树。
给你一棵树,问是否是FIBFIBFIB树
注意这是个递归定义来着


解题思路:

  1. 首先我们知道n=fib[i]=fib[i−1]+fib[i−2]n=fib[i]=fib[i-1]+fib[i-2]n=fib[i]=fib[i−1]+fib[i−2]
  2. 那么fib[i]fib[i]fib[i]只能划分成fib[i−1]和fib[i−2]fib[i-1]和fib[i-2]fib[i−1]和fib[i−2]
  3. 我们转化一下fib[i]=2∗fib[i−2]+fib[i−3]<3∗fib[i−2]fib[i]=2*fib[i-2]+fib[i-3]<3*fib[i-2]fib[i]=2∗fib[i−2]+fib[i−3]<3∗fib[i−2]
  4. 那么我们知道一个树里面最多有两个子树的大小是fib[i−2]fib[i-2]fib[i−2]那么我们要选择切哪条边呢?
  5. 其实选择哪条边都一样因为,fib[i−1]=fib[i−2]+fib[i−3]fib[i-1]=fib[i-2]+fib[i-3]fib[i−1]=fib[i−2]+fib[i−3]!!那么就是两条边最终还是会被切掉的,所以随便切一条就可以了
  6. 那么我们暴力去模拟题意就可以了?时间复杂度是O(n2)??O(n^2)??O(n2)??

    很明显不是,因为每次分裂最大递归log=27log=27log=27层,斐波那契的层数!!
    时间复杂度是O(nlog(n))O(nlog(n))O(nlog(n))

AC code

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n;
struct node {int nxt, to;
}edge[maxn];
int head[maxn], cnt;
bool tag[maxn];inline void add(int from, int to) {edge[cnt] = {head[from],to};head[from] = cnt++;
}//........................
int f[maxn];
bool vis[maxn];
inline void init() {ms(head,-1);f[0] = f[1] = 1;vis[1] = 1;for(int i = 2; ; ++ i) {f[i] = f[i-1] + f[i-2];vis[f[i]] = 1;if(f[i]>200000) break;}
}//........................
int siz[maxn];
int pos, posfa;
inline void dfs(int u, int fa,int num) {siz[u] = 1;for(int i = head[u]; ~i; i = edge[i].nxt) {int v = edge[i].to;if(v == fa || tag[i]) continue;dfs(v,u,num);if(~pos) return;if(vis[siz[v]]&&vis[num-siz[v]]) {tag[i] = tag[i^1] = 1;pos = v;posfa = u;return;}siz[u] += siz[v];}
}inline void Div(int now, int num) {if(num == 1) return;pos = -1, posfa = -1;dfs(now,0,num);if(pos==-1) {cout << "NO\n";exit(0);}int backposfa = posfa, backupnum = num - siz[pos];Div(pos,siz[pos]);Div(backposfa,backupnum);
}int main() {IOS;init();cin >> n;if(!vis[n]) {cout << "NO";return 0;}for(int i = 1; i <= n-1; ++ i) {int u, v;cin >> u >> v;add(u,v);add(v,u);}Div(1,n);cout << "YES\n";return 0;
}

树上问题 ---- E. Fib-tree(斐波那契数的性质 + 暴力模拟 + 认真计算复杂度)相关推荐

  1. [算法学习]斐波那契数的计算

    决定开始看algorithms,而且尽量多思考,多写点代码.第一个碰到的算法就很具有启发性,一些看似正确的算法,实际的复杂度却很高.我们直接看问题: 问题:假设fibonacci(0)=0,fibon ...

  2. 算法----斐波那契数

    題目 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F ...

  3. 动态规划学习之三种方法解决斐波拉契数

    斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会 ...

  4. LeetCode-动态规划基础题-509. 斐波那契数

    描述 题目如下: 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0 ...

  5. 【快乐水题】509. 斐波那契数

    原题: 力扣链接:509. 斐波那契数 题目简述: 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F( ...

  6. 斐波那契数与二分法的递归与非递归算法及其复杂度分析

    1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...

  7. 斐波那契数的两种求法(迭代,递归)

    **斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F( ...

  8. [leetcode]509. 斐波那契数

    斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) = F(n ...

  9. SICP 之斐波那契数

    这是斐波那契数 中用迭实现的 (define (fib n) (fib-iter 1 0 n)) (define (fib-iter a b count) (if(= count 0) b (fib- ...

最新文章

  1. DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优
  2. [svc][op]vim自动添加注释
  3. 【直播课】6小时掌握YOLO缺陷检测与Faster RCNN动物检测实战
  4. 3皮卡丘眨眼代码_眨眼检测调研以及活体检测应用
  5. 使用 SAP WebIDE 将SAP UI5 应用部署到 SAP ABAP Netweaver 服务器上
  6. Kubernetes中分布式存储Rook-Ceph部署快速演练
  7. ZZULIJ 1129: 第几天
  8. php 重定向 post,使用php curl getpost方法向页面文件发送重定向指令
  9. 数据结构和算法———P3 时间复杂度和空间复杂度
  10. JAVA 读取txt文件内容
  11. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
  12. c语言 电脑 控制串口,PC与单片机RS-232串口的通讯和控制
  13. 吴恩达深度学习课程——神经网络与深度学习
  14. 计算机高中会考inpute,高中信息技术会考知识点
  15. 加密软件pgp 使用教程
  16. 怎样提升小程序UV访客,快速开通流量主!
  17. 2月人民日报申论范文合辑(含获取方式)
  18. Windows 11 中打印时提示打印机不兼容,都来是“+”惹的祸
  19. 微信小程序开发日记1
  20. 用微信公众号做淘宝优惠券查券和返利机器人的详细设置教程

热门文章

  1. 多任务的介绍(并发、并行)
  2. Scrapy框架中管道的使用
  3. ubuntu18 安装python3.8.tgz
  4. java的关键字与保留字
  5. 蜜罐的详细配置过程以及所需要的的软件!以及全部配置!
  6. 解密 | OpenCV加载图像大小是有限制的 ?
  7. 原理+代码实战 | 双目视觉中的极线校正
  8. 第十五篇:依存语法Dependency Grammar
  9. 根据status信息对MySQL服务器进行优化-2
  10. vue 结合 echarts