之前一直不把trie當回事,直到今天看了篇部落格,據說01trie可以當平衡樹使?然後就學了學,發現和權值線段樹也沒什麼區別
01trie
權值線段樹的本質是一棵01trie
01trie就是把數字的二進位制位從高到低當做字串扔進trie裡
巨佬一眼就能看出,把最高位是0的當做左兒子,最高位是1的當做右兒子,這玩意就是權值線段樹。
只是01trie的邊界有一些特性其實權值線段樹也能實現,可以用來做一些按位運算的題。當然,權值線段樹能實現的所有功能它都能實現。
例題:【模板】普通平衡樹
做法:就和權值線段樹做法是一樣的。這題中平衡樹能實現的功能01trie也都能實現
媽媽再也不用教我寫平衡樹了
好吧平衡樹還是有獨特的功能的,比如區間翻轉。
方法就和權值線段樹實現一樣。
感覺**硬生生地比splay少了rotate和splay函式。
應該很好懂的 自認碼風比較友好
**:
可持久化01trie#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;
}
其實和主席樹沒什麼區別
就是邊界有了一些特性。
例題:最大異或和
做法:設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))
(snxo
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)**:
結語:01trie本質上與權值線段樹並無差異,只是有了二進位制位的特性,還有就是01trie較為容易寫非遞迴版本,常數上稍稍好一些。可持久化01trie可以解決與按位運算有關的一類問題。#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)
題意 轉化後的題意是有一種操作 一種詢問 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...