字典樹 最大異或對路徑

2022-07-16 13:30:23 字數 1042 閱讀 6878

給你\(n\)個關係,表示 \(u,v\) 兩點間有一條邊,且有邊權,問異或和長度最大的路徑的異或值是多少?

和上一道題很像,但是需要轉化一下思路,我們上一道題是兩個點之間進行計算,那麼這道題是不是也能這樣計算呢?當然可以,但是需要轉化模型,對於任意兩點 \(u, v\) 而言,\(u -> root\) 和 \(v->root\) 都可以將其路徑的異或值都算出來,我們這裡假設 \(u,v\) 在根節點的同乙個子樹上,那麼這兩個點到根節點的路徑一定有相交的路徑,如果我們想得到 \(u -> v\) 就可以用下面的等式 ,我們這裡假設 \(d[x]\) 為從\(x\)點到根節點的路徑 那麼就有 \(d[u] \wedge d[v] \wedge d[lca(u,v)] \wedge d[lca(u,v)]\) 又因為異或滿足結合律,於是可得最終結果為 \(d[u]\wedge d[v]\) ,於是我們就可以將每個點到根節點的結果預處理出來,最終我們就將模型轉化到點上了,建個trie樹,跑一遍就好

**如下

//#define fre yes

#include const int n = 100005;

int head[n << 1], to[n << 1], ver[n << 1], edge[n];

struct node trie[n * 30];

int tot;

void addedge(int x, int y, int z)

void dfs(int u, int fa, int sum)

}}int idx;

void insert(int x)

}int main()

dfs(0, -1, 0);

for (int i = 1; i <= n; i++) insert(a[i]);

int ans = 0;

for (int i = 1; i <= n; i++) ans = std::max(ans, search(a[i]));

printf("%d\n", ans);

return 0;

}

最大異或(字典樹應用)

乙個字典樹與異或運算的集合。當時寫超時了,不知道為什麼。先記錄下來 題目 zeus 和 prometheus 做了乙個遊戲,prometheus 給 zeus 乙個集合,集合中包含了n個正整數,隨後 prometheus 將向 zeus 發起m次詢問,每次詢問中包含乙個正整數 s 之後 zeus 需...

最大異或對 字典樹

在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式 第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式 輸出乙個整數表示答案。資料範圍 1 n 105,0 ai 231 輸入樣例 31 2 3 輸出樣例 3 基於貪心的思想 異或是一種不進製加法...

字典樹 最大異或對

分析程式 最大異或對,就是給出一堆數,然後在這一堆數中選擇兩個數,使得異或後結果最大。所涉及到的知識點有 字典樹,二進位制的思想 這樣寫不出意外是會超時的,因為這樣看的話,他的時間複雜度是o n n 然後題中給出的資料是10的五次方。所以說這樣的話,需要執行10的十次方次操作,而機器在一秒中只能執行...