description
給定一大小為n的有點權樹,每次詢問一對點(u,v),問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊input長構成乙個三角形。同時還支援單點修改。
第一行兩個整數n、q表示樹的點數和運算元 第二行n個整數表示n個點的點權output以下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]
對每個詢問輸出一行表示答案,「y」表示有解,「n」表示無解。sample input
5 5sample output1 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
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的父親 以...