01Trie 可持久化01Trie學習筆記

2021-09-26 05:32:59 字數 2978 閱讀 8832

之前一直不把trie當回事,直到今天看了篇部落格,據說01trie可以當平衡樹使?然後就學了學,發現和權值線段樹也沒什麼區別

01trie

權值線段樹的本質是一棵01trie

01trie就是把數字的二進位制位從高到低當做字串扔進trie裡

巨佬一眼就能看出,把最高位是0的當做左兒子,最高位是1的當做右兒子,這玩意就是權值線段樹。

只是01trie的邊界有一些特性其實權值線段樹也能實現,可以用來做一些按位運算的題。當然,權值線段樹能實現的所有功能它都能實現。

例題:【模板】普通平衡樹

做法:就和權值線段樹做法是一樣的。這題中平衡樹能實現的功能01trie也都能實現

媽媽再也不用教我寫平衡樹了

好吧平衡樹還是有獨特的功能的,比如區間翻轉。

方法就和權值線段樹實現一樣。

感覺**硬生生地比splay少了rotate和splay函式。

應該很好懂的 自認碼風比較友好

**:

#include

#include

#include

using

namespace std;

const

int q =

1e7;

struct tree

;struct trie

void

insert

(int x)

b[p]

.end++;}

void

del(

int x)

b[p]

.end--;}

intget_sum

(int x)

return b[p]

.end;

}int

get_rank

(int x)

return ret +1;

}int

get_kth

(int k)

}return ret;

}int

get_fr

(int x)

intget_nx

(int x)

}t;int

main()

return0;

}

可持久化01trie

其實和主席樹沒什麼區別

就是邊界有了一些特性。

例題:最大異或和

做法:設s

ns_n

sn​ = a

1a_1

a1​ xor

xorxora2

a_2a2

​ xo

rxor

xor...

......xo

rxor

xora

na_n

an​則a

pa_p

ap​ xor

xorxorap

+1

a_ap

+1​ xor

xorxor..

....

...xor

xorxoran

a_nan

​ = sp−

1s_

sp−1​ xor

xorxorsn

s_nsn

​於是我們發現,這裡的s

ns_n

sn​是個常量,只需在新增數的時候計算一下即可

於是我們只需要求max

(s

imax(s_i

max(si

​ xo

rxor

xor(sn

xorx

))

(s_n xor x))

(sn​xo

rx))

,其中l−1

<=i

<=r

−1

l - 1 <= i <= r - 1

l−1<=i

<=r

−1可持久化01trie。從高往低能取1就取即可。

注意特判一下l=1

l = 1

l=1的情況。

時間複雜度o(q

logw

)o(qlogw)

o(qlog

w)**:

#include

#include

#include

using

namespace std;

const

int n =

600005

, k =26;

struct tree

b[n *27]

;int n, m, x, l, r, c;

char ch[10]

;int t[n]

, s[n]

, cnt;

intupdate

(int t,

int x,

int k)

if(x &(1

<< k)

) b[p]

.ch[1]

=update

(b[t]

.ch[1]

, x, k -1)

;else

b[p]

.ch[0]

=update

(b[t]

.ch[0]

, x, k -1)

;return p;

}int

query

(int p,

int q,

int x)

else

k--;}

return ret;

}int

main()

for(

int i =

1; i <= m; i++

)else

}return0;

}

結語:01trie本質上與權值線段樹並無差異,只是有了二進位制位的特性,還有就是01trie較為容易寫非遞迴版本,常數上稍稍好一些。可持久化01trie可以解決與按位運算有關的一類問題。

最大異或和(可持久化01trie)

題意 轉化後的題意是有一種操作 一種詢問 1.操作 在序列末尾插入乙個數 2.詢問 給定l,r x l,r,x l,r,x,求區間l,r l,rl,r中與x xx異或能得到的最大異或值 化後的題意 思路 題意都被轉化成這樣了。應該就沒啥難度了 用類似主席樹的方式構建可持久化01tr ie 01tri...

異或最大 0 1trie

傳送門 每個整數看著32位的二進位制01串,將n個數從高位到低位依次插入到乙個01trie中。考慮插入第i個數,相當於在trie中進行依次檢索,根據xor相同為0,不同為1的特點,貪心的每次走與ai當前位相反的指標,如果沒有相反的節點則走相同的,這樣就可以得到與ai做xor運算的最大aj inclu...

01trie模板 (校內OJ

3827 the xor largest pair woj 描述在給定的 n 個整數 a1,a2,an 中選出兩個進行異或運算,得到的結果最大是多少?一道基礎的 01串trie 只知道trie,根據二進位制的性質,取反匹配,不難想到解法 最後注意邊加數邊去最大匹配值 有順序地列舉 這樣效率 nlog...