dfs序 可持久化字典樹

2021-10-07 17:07:49 字數 1043 閱讀 6386

query on a tree

題意:有一顆樹,有n個節點,每個節點都有權值,有q次詢問,每次詢問以u為根的子樹節點權值中異或x結果最大的值。

題解:首先解決u為根子樹節點的問題,直接dfs序,解決異或,用字典樹,但是同時用的話,就需要用可持久化字典樹,其實就是字首樹。這題學習到一波可持久化字典樹。

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e5+10;

struct node

tr[maxn*32]

;int tot =

0,cnt =0;

int l[maxn]

,r[maxn]

;int rt[maxn]

,a[maxn]

;vector<

int>g[maxn]

;int ans =0;

void

build

(int pre,

int now,

int val,

int pos)

void

dfs(

int u)

voidqu(

int pre,

int now,

int val,

int pos)

else

qu(tr[pre]

.son[tmp]

,tr[now]

.son[tmp]

,val,pos-1)

;}intmain()

tot =

0; cnt =0;

for(

int i=

2;i<=n;i++

)dfs(1

);for(

int i=

1;i<=q;i++)}

}

可持久化字典樹

以每個結點為根,建一顆字典樹 內容為1到i的值 這樣之後,做差後,即為一段區間或是一段路徑。可以發現,如果裸著建,不僅要消耗很多的時間,更是要消耗很多的空間。考慮以i為根的字典樹和以 i 1 為跟的字典樹的異同。可以發現,在當前以i為根的字典樹上減去a i 就是 i 1 的字典樹了。所以,我們可以將...

模板 可持久化字典樹

made by xiper updata time 2015 12 8 test status 使用前呼叫初始化函式 init 同時 root 0 0 struct trie persistent tree triesize 獲取字符集雜湊編號 必須在 0 lettersize 之內 inline ...

bzoj4546 可持久化字典樹

可持久化字典樹模板題。把每個數轉換成二進位制建立字典樹,按照下標建立可持久化字典樹,存一下子樹中點的個數就行了。1 include2 include3 include4 include5 using namespace std 6 inline char nc 12return p1 13 14 i...