樹上三角形(斐波那契數列神奇應用)

2021-08-09 10:54:08 字數 1193 閱讀 6257

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]

我們分析三個點權值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的路徑,我們直接暴力瞎搞就可以了

斐波那契 偷木棍破壞三角形

hdu 5914 題意 輸入n表示某人有1,2,3,4 n,一共n根木棍,求偷走幾根木棍後某人無法將剩餘的木棍組成三角形。題解 由於長度越大越容易組成三角,先用s i 標記可以留下那些長度的木棍。貪心思想,留下的長度盡可能小,為後面的留空間 1,2,3,x,5,x,x,8,x,x,x,x,13 大概...

HDU 6601 三角形 主席樹 斐波那契數列

給n個邊的長度,詢問q次,每次詢問回答能構成的三角形的最大周長。n和q都是1e5 1e51e 5的範圍。先想想如果就給乙個陣列求最大周長三角形的做法。容易想到就是排個序,從大到小列舉n 2次,每次檢查三條邊能不能構成三角形,如果不行,那麼最大的那條邊就沒有其他邊可以跟他組了,其他邊都更小 如果遇到了...

樹上三角形

description 給定一大小為n的有點權樹,每次詢問一對點 u,v 問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊長構成乙個三角形。同時還支援單點修改。input 第一行兩個整數n q表示樹的點數和運算元 第二行n個整數表示n個點的點權 以下n 1行,每行2個整數a b,表示a是b的...