BZOJ 3251 樹上三角形

2022-09-06 17:24:07 字數 999 閱讀 5606

【題解】

算是個思維題。。

題目資料範圍很大,而是否能組成三角形這種資訊也無法用資料結構維護,那怎麼辦呢?

我們可以發現,如果想要乙個數列任意三項不能組成三角形且各項盡量小,這個數列就是乙個斐波那契數列。而本題中點權範圍為int範圍內,我們可以發現在int範圍內斐波那契數列只有46項。

那麼如果給出的鏈上面的點數大於50項,就一定存在三個點可以組成三角形。如果鏈上的點數小於50,我們直接排序後判斷即可。

1 #include2 #include3

#define rg register

4#define n 100010

5using

namespace

std;

6int

n,m,tot,val[n],tmp[n],fa[n],last[n],dep[n];

7struct

edgee[n<<1

];10 inline int

read()

16void dfs(int

x)20 inline bool query(int x,int

y)28

if(cnt>=50) return1;

29 sort(tmp+1,tmp+1+cnt);

30for(rg int i=1;i<=cnt-2;i++)

31if(tmp[i]>tmp[i+2]-tmp[i+1]) return1;

32return0;

33}34int

main(); last[x]=tot;

40 fa[y]=x;41}

42 dfs(dep[1]=1

);43

while(m--)

48return0;

49 }

view code

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的父親 以...