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

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


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|

斐波那契数列

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值