Luogu P5018 對稱二叉樹 瞎搞樹 雜湊

2022-03-30 07:42:47 字數 1251 閱讀 4464

我的天。。普及組這麼$hard$。。。

然後好像沒有人用我的垃圾做法,,,好像是$o(n)$,但十分的慢,並且極其暴力$qwq$

具體來說,就是直接$dfs$求出樹高,然後想像出把原來的樹補成滿二叉樹的形態

震不震驚$qwq$

然後對子樹雜湊,同時儲存正向的雜湊值$h1[u]$和反向的雜湊值$h2[u]$(對稱時用)。

但每次向上合併時要乘的是$base^$,其中$sz=$子樹所形成的完全二叉樹的大小。

這樣雜湊值既可以表示點位置(不同的位置點在完全二叉樹中的位置不同),又可以表示點的數值。

如果還不懂可以康康**

#include#include

#include

#include

#define r register int

using

namespace

std;

#define ull unsigned long long

#define ll long long

#define pause (for(r i=1;i<=10000000000;++i))

#define in freopen("noipak++.in","r",stdin)

#define out freopen("out.out","w",stdout)

namespace

fread inline

bool isempty(const

char& ch)

inline

void gs(char*s)

}using fread::g; using

fread::gs;

const

int n=1000010,b=2333

;int ch[n][2

];#define ls ch[u][0]

#define rs ch[u][1]

intn,w[n],sz[n],d[n],ans,mxd;

ull h1[n],h2[n],p[n],tmp;

inline

void dfs1(int u)

inline

void dfs(int u)

signed main()

2019.07.08/09

luogu P5018 對稱二叉樹

帶權的二叉樹裡找一棵節點數最多的子樹使得權值和結構都對稱 1e6這題最主要的點還是計算時間複雜度 剛看到的時候總是覺得每個點都要再往下找 那麼這個複雜度顯然是n方的 但是實際上是 n n 2 n 2 n 4 n 4 1 複雜度是嚴格的nlogn 另外就是對樹的遞迴的處理 我總是想在乙個遞迴裡做完所有...

P5018 對稱二叉樹

題解 什麼是對稱二叉樹,簡潔一點就是 任意一棵對稱二叉樹,以根節點為軸,是軸對稱的 qwq我真的只能解釋道這樣了 這道題可以用dfs求解 dfs深搜,size x 記錄以 x 為根的樹的大小 也就是以 x 為根的樹的所有節點的總數 當前節點左兒子非空,繼續遞迴左兒子,右兒子非空,繼續遞迴右兒子 si...

101 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。思路 遞迴就用dfs,迭代是b...