給定一大小為n的有點權樹,每次詢問一對點(u,v),問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊長構成乙個三角形。同時還支援單點修改。
第一行兩個整數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
對每個詢問輸出一行表示答案,「y」表示有解,「n」表示無解。
5 5
1 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
對於100%的資料,n,q<=100000,點權範圍[1,2^31-1]
這道題實在腦洞好大,如果建樹判斷一條樹上是否能構成三角形,那顯然是不行的,所以要先判斷在一定的數中最多有哪些數可以構成三角形,那一定就是斐波那契數列,int範圍內的斐波那契數一共是46個,所以只要一串數超過46個就一定可以構成三角形,如果不到46個,那就將這串數排序查詢,之後就是裸的lca
#include
#include
#include
#include
#include
#include
#define n 100010
#define m 46
using
namespace
std;
typedef
long
long ll;
int n,m,tot;
int a[n];
int head[n];
int tail[n];
int next[n];
int dfn[n];
int fa[n];
int q[50];
int cmp(const
void *x,const
void *y)
void add(int x,int y)
void dfs(int u,int deep)
}bool lca(int x,int y)
return
false;
}int main()
dfs(1,1);
for(int i=1;i<=m;i++)
}return
0;}
bzoj3251 樹上三角形
題意 有根樹,支援兩種操作,詢問從u v的簡單路徑上是否存在三個點權可以構成三角形,單點修改點權。暑假多校的時候就見過這個斐波那契性質。兩邊之和大於第三邊,顯然這是個很套路的東西,這個性質就是斐波那契性質,而斐波那契數列至多在五十項左右的時候炸int,故若簡單路徑長度大於50,那麼必然有解,否則暴力...
bzoj3251 樹上三角形
傳送門 題目 給定一大小為n的有點權樹,每次詢問一對點 u,v 問是否能在u到v的簡單路徑上取三個點權,以這三個權值為邊 長構成乙個三角形。同時還支援單點修改。input 第一行兩個整數n q表示樹的點數和運算元 第二行n個整數表示n個點的點權 以下n 1行,每行2個整數a b,表示a是b的父親 以...
BZOJ 3251 樹上三角形
傳送門 看到這種奇怪的要求,考慮一下推結論 考慮把路徑上的點權拿出來排序,變成乙個數列,那麼顯然我們只要考慮相鄰連續的 3 個數 發現如果我們貪心構造乙個盡量無法構成三角形的數列,那麼最小的數列就是斐波那契數列 眾所周知斐波那契數列增長很快,第 50 項顯然遠大於題目給出的點權範圍,所以如果 u,v...