树上三角形(斐波那契数列神奇应用)
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