bzoj3251 樹上三角形

2021-09-29 21:11:16 字數 1088 閱讀 3398

題意:有根樹,支援兩種操作,詢問從u->v的簡單路徑上是否存在三個點權可以構成三角形,單點修改點權。

暑假多校的時候就見過這個斐波那契性質。

兩邊之和大於第三邊,顯然這是個很套路的東西,這個性質就是斐波那契性質,而斐波那契數列至多在五十項左右的時候炸int,故若簡單路徑長度大於50,那麼必然有解,否則暴力check即可。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+7;

const

int ci=18;

int fa[maxn][20

];int w[maxn]

;int dep[maxn]

;vector<

int> g[maxn]

;void

dfs(

int u,

int last)

}int

lca(

int x,

int y)

vector<

int> v;

bool

check

(ll x,ll y,ll z)

bool

check

(int x,

int y)

while

(y!=lca)

v.push_back

(w[lca]);

sort

(v.begin()

,v.end()

);for(

int i=v.

size()

-1;i>=2;

--i)if(

check

(v[i]

,v[i-1]

,v[i-2]

))return1;

return0;

}int

main()

dfs(1,

0);while

(q--

)return0;

}

bzoj3251 樹上三角形

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

bzoj3251 樹上三角形

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

BZOJ 3251 樹上三角形

傳送門 看到這種奇怪的要求,考慮一下推結論 考慮把路徑上的點權拿出來排序,變成乙個數列,那麼顯然我們只要考慮相鄰連續的 3 個數 發現如果我們貪心構造乙個盡量無法構成三角形的數列,那麼最小的數列就是斐波那契數列 眾所周知斐波那契數列增長很快,第 50 項顯然遠大於題目給出的點權範圍,所以如果 u,v...