bzoj3251 亂搞 樹上三角形

2021-08-28 12:38:33 字數 1937 閱讀 1363

description

給定一大小為n的有點權樹,每次詢問一對點(u,v),問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊

長構成乙個三角形。同時還支援單點修改。

input

第一行兩個整數n、q表示樹的點數和運算元 第二行n個整數表示n個點的點權

以下n-1行,每行2個整數a、b,表示a是b的父親(以1為根的情況下) 以下q行,每行3個整數t、a、b 若t=0,則詢問(a,b)

若t=1,則將點a的點權修改為b n,q<=100000,點權範圍[1,2^31-1]

output

對每個詢問輸出一行表示答案,「y」表示有解,「n」表示無解。

sample input

5 5

1 2 3 4 5

1 22 3

3 41 5

0 1 3

0 4 5

1 1 4

0 2 5

0 2 3

sample output

nyy

n

題解

先考慮給你n個值讓你判三角形

把他們排序

從前往後列舉三個值判就可以了…

拓展到樹上

我們發現

乙個不合法的序列長度不會超過斐波那契數列的乙個值

因為每次都會擴大a[i]+a[i-1]

然後…如果兩點距離大於45 肯定合法

斐波那契數列在45左右就超了int了

否則你就暴力判.

沒了啊

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}inline

void

write

(int x)

inline

void

print

(int x)

struct nodea[

210000];

int len,last[

110000];

void

ins(

int x,

int y)

int fa[

110000][

25],dep[

110000

],bin[25]

;void

pre_tree_node

(int x)}}

intlca

(int x,

int y)

int n,m,cal[

110000];

int sta[

110000

],tp;

intmain()

pre_tree_node(1

);while

(m--)if

(!bk)

puts

("n");

else

puts

("y");

}}else cal[x]

=y;}

return0;

}

bzoj3251 樹上三角形

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

bzoj3251 樹上三角形

題意 有根樹,支援兩種操作,詢問從u v的簡單路徑上是否存在三個點權可以構成三角形,單點修改點權。暑假多校的時候就見過這個斐波那契性質。兩邊之和大於第三邊,顯然這是個很套路的東西,這個性質就是斐波那契性質,而斐波那契數列至多在五十項左右的時候炸int,故若簡單路徑長度大於50,那麼必然有解,否則暴力...

bzoj3251 樹上三角形

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