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...