現有乙個 n 個點的完全圖,點編號為1 到 n。另給出乙個長度為n 的序列 ai,完全圖中第 i 個點與第j 個點間的邊的邊權為 ai⊕aj,其中 ⊕ 表示按位異或運算。
請您找出該完全圖的最小生成鏈。由於答案可能很多,您只需輸出這條最小生成鏈中邊權最大的邊的邊權即可。
這道題可以想到乙個性質,就是在比較兩個數的大小時,如果前面位置的數相同,從第乙個不同的數開始比較,那麼位置大的數大的這個數就大;
就是從高位比較;
二進位制數也有這個性質;
這個題可以用最小生成樹來寫暴力(部分分),就是可以證明最小生成樹上最大的邊等於最小生成鏈上最大的邊;
我也不會證,我也不敢問;
貼個題解
證明:首先最小生成樹的最大邊一定不大於最小生成鏈的最大邊,
然後按照下文的做法分為 0,1 兩塊後,
中間這條邊就是最小生成鏈最大邊。
如果不連上這條邊,那麼 0的連通塊和 1的連通塊無法連通。
因此這條邊一定在最小生成樹中,也就是說最小生成樹的最大邊不小於最小生成鏈的最大邊。
於是就證明了兩種的最大邊相等。
就是在所有點的權值中,前面的位置數都相同,那麼異或後都是零,不用管;
從第乙個有0有1的位置開始(位置為i),可以把0分為一組,1分為一組;
0中連邊不會超過1<
那麼只缺這兩個連通塊中連一條邊了,這個邊就是最大邊;
我們希望這個交界的部分兩元素異或值最小。也就是說,我們需要從這一位為 00 的元素中和這一位為 11的元素中各找出乙個元素,使得這兩個元素的異或值最小。
接下來這個找最小值的過程可以進行優化。這裡有異或操作,很自然地能夠想到 0-1 trie。我們可以維護一棵 0-1 trie,我們將序列中所有這一位為 0的元素插入這棵 trie,然後用所有這一位為 1的元素去 trie 中查異或最小值。最後所有最小值的最小值就是答案了。
要注意特判一下所有元素都相同的情況,因為這會找不到這個最高的位滿足這一位上有 0和 1。
時間複雜度和空間複雜度都是 o(nlogai)。
#include#include#include
using
namespace
std;
const
int maxn=1e6+100
;typedef
long
long
ll;ll trie[
3][maxn],cnt=1
;ll n,a[maxn];
ll maxl=-1
;ll ans=1e18;
void
insert(ll x)
}ll qmin(ll x)
}return
res;
}int
main()
sort(a+1,a+n+1
);
for(int i=59;i>=0;i--)
}if(maxl==-1
)
for(int i=1;i<=n;i++)
printf(
"%lld
",ans);
return0;
}
Trie樹及其應用
一,知識簡介 trie樹,又稱單詞查詢樹 鍵樹或字首樹。典型應用是用於排序和統計大量字串,但不僅限於於字串,所以經常被搜尋引擎用於文字詞頻統計。它的優點是 最大限度的減少無謂的字串比較,查詢效率比雜湊表高。字典樹的核心思想是以空間換時間,利用字串的公共字首來降低查詢時間開銷來達到提高效率的目的。tr...
字典(trie)樹的應用與實現
字典樹又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。常見的可以使用字典樹解決的問題舉例 ...
Trie樹 髒詞過濾應用
當前的 還只是進行簡單的替換,並沒有做一些字元的處理,比如 昨天見到你媽,逼我要買房 這本身不是髒詞,因為有逗號,所以程式裡要增加字元的範圍判斷。程式中的skip就是用來過濾髒詞的簡單變體,比如 找 小 姐 預設是最多跳過3個字元,這個可以隨便調整了。總之是乙個trie的鍛鍊吧。public cla...