一點01trie的使用技巧

2021-08-15 14:48:36 字數 1191 閱讀 3341

在trie裡找xor最大值

沙比題,當前位是1就優先走0,是0就優先走1

在trie裡找and或者or最大值

以and為例,如果當前位是1的話,那麼肯定優先走1。然而如果當前位是0的話,那麼走0或者走1都有可能有最優解,這樣複雜度就是不對的

但是可以發現,我們一定不會只走0而不走1,於是我們可以在建完trie後,把1的樹向0合併,這樣問題就解決了。(合併的時候注意順序,先合併子樹內的再合併大的,而且需要打flag防止重複合併。或者也可以自底向上合併)nl

og2值

域 nlo

g值域2

在trie裡找第m大的異或值

二分答案,考慮如何check

每次check時把所有數都拿進trie裡跑一遍,並統計異或的值大於當前二分的mid的數有多少個(在每個節點維護乙個cnt表示,這個節點被經過了多少次即可輕鬆統計,不過有細節)

累計上面統計的值,如果這個值大於了2∗

m 2∗m

(a^b=b^a,會被統計兩遍),那麼說明mid小了,否則mid大了nl

og值域

n lo

g值

域在trie裡找第m大的異或值

按位確定答案,寫乙個找第k大的函式 kth(node *nd , int k),呼叫就是kth(root,m)

在確定每一位時,判斷當前這位選1的方案有多少個,如果大於了當前的k,那麼說明第m大的數字該位一定為1,否則為0

如何統計當前這一位選1的方案呢?在查詢的時候,每個節點都對應了trie上的另乙個節點,比如當前已經確定了前四位,正在確定第五位,就是1010x,那麼trie上的1011就對應了0001這個節點(1011^0001=1010),那麼x選1的方案數

= =

停留在10111上的數字個數

×' role="presentation" style="position: relative;">×

×停留在00010的個數

+ +

停留在10110上的數字個數

×' role="presentation" style="position: relative;">×

×停留在00011的個數。有一種分類處理的感覺

然後根據這個方案數的大小就可以確定這一位的值,然後就是子問題了。

由於每確定一位都需要把所有的數字在trie裡往下走一位,還要找到對應節點統計方案數,最後總共複雜度是nlog的

索引使用 一點技巧

user info 表中 欄位user no 建立了索引,而且索引的區分度很高,一直報慢查詢,檢視執行計畫發現一直不走索引。原因 user info 表中的user no 為varchar型別,但是查詢條件中是數值型,這種情況下會導致索引失效,將語句修改為 select from user info...

一本通學習筆記 字典樹與 0 1 Trie

字典樹中根到每個結點對應原串集合的乙個字首,這個字首由路徑上所有轉移邊對應的字母構成。我們可以對每個結點維護一些需要的資訊,這樣即可以去做很多事情。include using namespace std namespace trie node root node pool 1000005 int i...

一點學習技巧

學習乙個新東西或者說要掌握乙個東西,要先理清他的脈絡,結構,做到心中有數,然後再就揪細節。就像高中時候寫作文一樣,我的文章 都是議 結構基本是一成不變的。總分總,分的中間,又是排比段落,總結,排比段落,總結。確認好主題,就是忘裡面填東西,所以只要有素材,寫作文特別快。同樣的,到了乙個新城市,你想要快...