cf888g
trie上貪心,先左右兩邊連邊,再用一條邊的代價連起左右兩顆樹。因為內部的邊一定比跨兩棵樹的邊權笑,顯然是對的。
**自己瞎yy的。啟發式合併
#include #define ll long long
using namespace std;
const int _=2e5+7;
int n,a[_],ch[_*30][2],siz[_*30],cnt,col,rt[_*30];
ll ans;
std::vectordsr[_*30];
void insert(int x)
return ans;
}void dfs(int p,int dep) else
ans+=tmp;
ch[p][!k]=nb; }}
int main()
最小異或生成樹Xor MST
1.將每個點的權值轉換成二進位制,從高位往低位依次插入01字典樹.2.dfs遍歷該字典樹的每個結點,如果某個結點有兩個子節點,這兩個子節點的子樹分別會構成兩個連通塊,要在這兩個連通塊之間各選乙個點連邊並使它們的異或值最小,通過find函式遞迴處理這個問題.ans還要加上此時產生的二進位制位對應的值....
G Xor MST(異或最小生成樹)
異或最小生成樹,這裡採用了一種分治的方法來貪心求解最值 為什麼這樣是對的 顯然我們分成兩個集合我們可以抵消掉高位的一大堆一樣的東西,這個時候,我們可以保證我們的貪心策略是正確的。為什麼我們要合併兩個集合 假設左邊集合有n nn個點,右邊集合有m mm個點,顯然左邊最多鏈結n 1 n 1 n 1條邊,...
最小異或生成樹學習筆記
最近打的區域賽模擬裡用到了最小異或生成樹 於是進行了一手學習 問題背景 有乙個序列,每個點有乙個權值 a i 取一條邊 i j 的代價是 a i xor a j 問這個圖的最小生成樹的邊權和 前置知識 trie樹 演算法原理 1 bor vka演算法 用於求解最小生成樹 做法 開始時,每個點都是乙個...