BZOJ3251 樹上三角形

2022-05-20 18:31:40 字數 1019 閱讀 9875

以傳統的維護思路特別不可做。完全想不到的一點是,如果構造乙個int內的數列使其中任意三個數都不能構成三角形,項數最多的方案顯然是斐波拉契數列,而斐波拉契數列的項數顯然是log級的。那麼我們求出詢問點之間的距離,如果超過項數直接輸出,否則暴力判斷即可。

開始算距離的時候沒把lca*2調了半天,而且明明可以暴力的為什麼還寫倍增啊。大概腦子壞了。

#include#include

#include

#include

#include

#include

using

namespace

std;

#define n 100010

#define int unsigned int

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}int n,m,a[n],p[n],fa[n][18],deep[n],q[61],t=0

;struct dataedge[n];

void addedge(int x,int y)

void dfs(intk)}

int lca(int x,int

y)signed main()

fa[1][0]=1

;

for (int j=1;j<18;j++)

for (int i=1;i<=n;i++)

fa[i][j]=fa[fa[i][j-1]][j-1

]; dfs(1);

while (m--)

if (flag) printf("

n\n"

);

else printf("

y\n"

); }

}else a[x]=y;

}return0;

}

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