树上三角形(斐波那契数列神奇应用)

树上三角形(斐波那契数列神奇应用)

Description
给定一个大小为 n 的有点权树,需要支持两个操作。
0:询问(u,v),能否在 u 到 v 的简单路径上取三个点,使这三个点的点权作为边
长可以构成一个三角形。
1:修改某个点的点权。

Input
第一行两个整数 n,q 表示树的点数和操作数。
第二行 n 个整数表示 n 个点的初始的点权。
接下来 n-1 行,每行两个整数 a,b,表示 a 是 b 的父亲。
接下来 q 行,每行三个整数 op,a,b:
若 op=0,则表示询问(a,b)。
若 op=1,则表示将 a 的点权修改为 b。

Output
对每个询问输出一行表示答案,“Y”表示有解,“N”表示无解,(不包括引号)

Sample Input
5 5
1 2 3 4 5
1 2
2 3
3 4
1 5
0 1 3
0 4 5
1 1 4
0 2 5
0 2 3

Sample Output
N
Y
Y
N

Sample Explaination
对于前 10%的数据,n,q<=100
对于前 30%的数据,n,q<=1000
对于另外 40%的数据,无修改操作
对于 100%的数据,n,q<=100000,点权范围[1,2^31-1]


Hint

我们分析三个点权值a,b,c怎么才能构成三角形:
若a,b,c构成三角形,则a+b>c且|a-b|c这一个条件,我们要使它不满足,最低的要求是使a+b=c.
于是我们得到了一个式子:c=a+b
有没有很眼熟?

斐波那契数列
我们要使一些值构不成三角形,最坏情况就是它们构成一个斐波那契数列.
1 1 2 3 5 8 13 21………
也就是说斐波那契数列有一个神奇的性质:
以斐波那契数列中任意三项的值为长的三条线段一定构不成三角形
我们推斐波那契数列,发现第50项左右就爆int了
而题意中限制了点权一定在int内,
所以一条路径若是长度超过50,它最坏情况就是有斐波那契数列在int里的那些项,然后还有一些其他的值,那么我们一定可以找到一组a,b,c构成三角形.
而对于长度不超过50的路径,我们直接暴力瞎搞就可以了

?

原文地址:https://www.cnblogs.com/LonelyRyan/p/8427566.html

时间: 2024-12-28 12:34:37

树上三角形(斐波那契数列神奇应用)的相关文章

阶乘、斐波那契数列、打印三角形(*)递归,冒泡排序

1.用递归求阶乘 5*4*3*2*1 static int Show(int num)//Show(5) { if (num <= 0) return 1; else return num*Show(num-1); } 2.斐波那契数列,1.1.2.3.5.8.13 求出第三十位 static int Show(int num)// Show(30) { if (num == 0 || num < 0) return 0; else if (num == 1 || num == 2) retu

《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨.他被人称作“比萨的列昂纳多”.1202年,他撰写了<算盘全书>(Liber Abacci)一书.他是第一个研究了

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

斐波那契数列公式算法-JS实现

之前算斐波那契数列都是算前两个数相加实现的 比如0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 2=1+1 3=1+2 5=2+3 8=3+5 …… 其实还有另外一个规律: 2 = 1*2-03 = 2*2-15 = 3*2-18 = 5*2-213= 8*2-321=13*2-5 …… 下面是JS实现的代码: <!DOCTYPE h

斐波那契数列——摘自搜狗百科

1数列公式 递推公式 斐波那契数列:0.1.1.2.3.5.8.13.21.34.55.89.144... 如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式: F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3) 通项公式 通项公式的推导方法一:利用特征方程 线性递推数列的特征方程为: X^2=X+1 解得 X1=(1+√5)/2, X2=(1-√5)/2. 斐波拉契数列则F(n)=C1*X1^n + C2*X2^n ∵F(1)=F(2

Tips_of_JS 之 利用JS实现水仙花数的寻找与实现斐波那契数列

一.水仙花数 1.啥是水仙花数? 水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 2.利用JS实现对水仙花数的寻找. 这一次我们寻找水仙花数的方法,是JS中非常基础的while循环.代码如下: si不si很神奇~ 二.斐波那契数列 1.啥是斐波那契数列? 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔

【poj3070】矩阵乘法求斐波那契数列

[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [分析] 这是我们熟悉的斐波那契数列,原来呢我们是递推求值的嘛,当然这是最水的想法~~可是!这里的n很大诶,有10^9,for一遍肯定是不可以的咯. 于是,我学会了用矩阵乘法求斐波那契数列(貌似是很经典的). 作为初学者的我觉得十分神奇!! 好,我们来看: 我们每次存两个数f[i-1]和f[i-2],

斐波那契数列实例讲解以及C++实现

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的研究成果. 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

求:简单又困难的 “斐波那契数列”代码

下面给出上篇博客的代码解释具体的我也在注释里面写清楚了. 至于矩阵构造嘛..还是要看个人悟性(也有运气),显然这个我还是不行的,这个矩阵初始化我复制的. 1 #include <cstdio> 2 #include <cstring> 3 const int M = 1E9 + 7; 4 struct Matrix { 5 long long a[2][2]; 6 Matrix() { memset(a, 0, sizeof(a)); } //构造矩阵 7 //定义矩阵乘法 8 M