樹上三角形

2021-08-03 16:59:08 字數 1270 閱讀 8822

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

output

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

sample input

5 51 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 outputny

ynhint

對於100%的資料,n,q<=100000,點權範圍[1,231-1]

題解 我們發現不能構成三角形的數列為菲波那切數列(1,1,2,3,5……),所以到第47項時已經超過了int,所以我們當點的個數大於47個時,就可以直接輸出y了。小於直接暴力。

**

#include

#define inf 10000005

#define n 100005

#define ll long long

using namespace std;

inline int

read()

while(ch>='0'&&ch<='9')

return

x*f;

}int head[n],ret[2

*n],next[2

*n];

int n,q,tot,c[55],fa[n],v[n],dep[n];

void ins(int u,int v)

void dfs(int u)

}}void solve(int a,int b)

sort(c+1,c+cnt+1);

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

if ((ll)c[i]+c[i+1]>c[i+2])

puts("n");

}int main()

dfs(1);int opt,x,y;

while (q--)

return

0;}

樹上三角形

題目描述 給定乙個大小為n的有點權樹,需要支援兩個操作。0 詢問 u,v 能否在u到v的簡單路徑上取三個點,使這三個點的點權作為邊長可以構成乙個三角形。1 修改某個點的點權。輸入格式 第一行兩個整數n,q表示樹的點數和運算元。第二行n個整數表示n個點的初始的點權。接下來n 1行,每行兩個整數a,b,...

樹上三角形 tri

時間限制 1 sec 記憶體限制 256 mb 題目描述 給定一大小為n的有點權樹,每次詢問一對點 u,v 問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊長構成乙個三角形。同時還支援單點修改 輸入 第一行兩個整數n q表示樹的點數和運算元 第二行n個整數表示n個點的點權 以下n 1行,每行...

3251 樹上三角形

題目鏈結 題目大意 給定一大小為n的有點權樹,每次詢問一對點 u,v 問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊長構成乙個三角形。同時還支援單點修改。題解 看到題目果斷開始想資料結構,感覺要上lct?蒟蒻表示不會 膜了一發題解後。考慮這樣乙個問題 有乙個數列,數列中的數滿足題目條件,那...