大致題目: 有一n個數, 給定一些詢問, 每次詢問乙個數, 問這n個數中與詢問的這個數xor起來最大的那個數是多少. 或者與這n個數中異或起來的最大值是多少…… 等等…. (相當於求取兩個數異或起來的最大值是多少, 這樣就可以暴力乙個, 01字典樹找另外乙個)
思想: 主要是從乙個二進位制位上面去考慮這個問題, 因為兩個數異或起來要盡量的大, 那麼肯定肯定異或的對應位置盡量是相反的, 即0 盡量和 1在一起, 1盡量和0一起, 那麼我們就可以通過這n個數建立一顆01字典樹,然後讓詢問的數在上面進行匹配, 並且利用貪心的思想, 從最高位開始建樹……
這個是模板, 帶刪除的. 基本上都適用.
帶刪除的01字典樹, 其實就是增加了乙個計數器, 刪掉這個節點其實就是將這個節點處的計數器–, 在詢問的時候, 判一下是否這個計數器是否大於零就是了.
測試題目 cf 706 d
const
int maxn = 5e6+5; // 注意一點, 範圍要盡量大點, 否則很容易re
const
int siz = 33;
int n, m;
struct trie trie[maxn];
int idx;
void build(int n)
trie[x].val = n; //把路的終點設定成該條路是那個數的.
}int query(int n)
return trie[x].val; //返回走的那條路的終點的值.
}void del(int n)
}void solve()
}
另一道題目 hdu 4825 01字典樹模板
題意 輸入n n次操作 x 插入x x 刪除x x 查詢已經插入的某個數與x異或的最大異或和思路 01字典樹模板題 遇到這題剛好可以更新一下自己的模板 以前的太醜了 ps 這題有個坑點是字典樹為空的情況下可能會查詢,所以開始的時候先插入乙個0 code include using namespace...
COJ 1216 異或最大值 01字典樹
題意 求n個非負數中任意2個的異或值的最大值。n數量級為10 5 分析 直接暴力肯定超時了。乙個非負整數可以看成1個32位的01字串,n個數可以看成n個字串,因此可以建立字典樹,建好樹後,對於任意非負整數x,可以沿著樹根往下貪心找到y,使得x異或y最大,複雜度為樹的深度。view code incl...
01字典樹 求序列完美度 求區間最大異或值
解題關鍵 01字典樹模板,用字典樹儲存每個數的二進位制表示,從而動態維護區間上的最大異或值,注意新增和刪除都可以用於乙個change函式表示。複雜度 o n log n log n 1 include2 define maxn 1005 3 define inf 0x3f3f3f3f 4using ...