樹上三角形

2021-08-09 10:48:35 字數 2282 閱讀 1373

題目描述

給定乙個大小為n的有點權樹,需要支援兩個操作。

0:詢問(u,v),能否在u到v的簡單路徑上取三個點,使這三個點的點權作為邊長可以構成乙個三角形。

1:修改某個點的點權。

輸入格式

第一行兩個整數n,q表示樹的點數和運算元。

第二行n個整數表示n個點的初始的點權。

接下來n-1行,每行兩個整數a,b,表示a是b的父親。

接下來q行,每行三個整數op,a,b:

若op=0,則表示詢問(a,b)。

若op=1,則表示將a的點權修改為b。

輸出格式

對每個詢問輸出一行表示答案,「y」表示有解,「n」表示無解,(不包括引號)

樣例輸入

5 5

1 2 3 4 5

1 2

2 3

3 4

1 5

0 1 3

0 4 5

1 1 4

0 2 5

0 2 3

樣例輸出

n y

y n

樣例解釋

對於前10%的資料,n,q<=100

對於前30%的資料,n,q<=1000

對於另外40%的資料,無修改操作

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

題目解析:

這道題正解是暴力,具體分為以下幾個步驟:

1.先證明一下這道題,如果這兩個點的距離超過47左右,就一定可以輸出y。

我們可以用菲薄那切數列來推,因為超過47左右,那就差不多會爆int範圍,而這道題的範圍是int

那為什麼超過int的範圍後就一定可以呢?我們看一下,這道題是要找出三個點,

把他們當作三角形的三邊,然後看能不能組成乙個三角形。然後我們考慮一下邊界情況,當a+b=c時

一直往後推,就是菲薄那切了。然後要在int範圍內,並且如果距離是大於47的,我們再把式子變形成a=c-b

那麼在int範圍內肯定是a>b-c的,所以是符合的(應該沒說錯吧)。

2.這給時候我們用樹剖或者是倍增求lca,然後求出他們的距離,直接判斷距離。如果距離小於47,那麼

把那些點權排序,暴力判斷一下就好了,只要存在就可以輸出y。都沒有就輸出n

/*此**是本校的一位大佬的**,自己的在考試中沒有過,後面改了下,發現有些地方得大改一下,於是不想改了,就放這位大佬的吧*/

#include

#include

#define re register int

#define fp(i,a,b) for(re i=a,i=b;i<=i;++i)

#define fd(i,a,b) for(re i=a,i=b;i>=i;--i)

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

using

namespace

std;

char ss[1

<<17],*a=ss,*b=ss;

inline

char gc()return*a++;}

template

inline

void sdf(t&x)

const

int n=1e5+5;

typedef

int arr[n];

struct edgese[n<<1];

int n,m,tot,tp;arr fi,w,stk,dep,top,son,sz,fa;

inline

void add(re u,re v);fi[u]=tot;}

void dfs1(re u)

}void dfs2(re u)

inline

int lca(re u,re v)

int main()

//加邊

dfs1(1);dfs2(1);

fp(i,1,m)

return0;}

/*最壞的情況1 1 2 3...最多47層就爆int了

所以只要dis(u,v)>47就return 1

剩下的就暴力算吧o(5*47q)還是可以過的

*/

小結:我猜著了開頭,但猜不著結尾。考試時想到了要去用樹剖做,但是是純暴力,沒加一點優化。然後加一點數學分析,就過了。這說明什麼,數學很重要,也許今年noip數學會考得很活(火)!得多訓練訓練數學思維!

樹上三角形

description 給定一大小為n的有點權樹,每次詢問一對點 u,v 問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊長構成乙個三角形。同時還支援單點修改。input 第一行兩個整數n q表示樹的點數和運算元 第二行n個整數表示n個點的點權 以下n 1行,每行2個整數a b,表示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?蒟蒻表示不會 膜了一發題解後。考慮這樣乙個問題 有乙個數列,數列中的數滿足題目條件,那...