2012noip模擬 最長路徑 path

2021-07-15 08:34:03 字數 1303 閱讀 9060

給定一棵有 n 個點和 n-1 條邊的樹,請你求出樹中的最長路徑。

這裡路徑長度是用 xor 定義的,即若經過的邊的權值為 a1,a2,a3,…,an,則這條路徑的總權值為a1 xor a2 xor a3 … xor an。

第1行為乙個正整數 n,為點的個數;

第2行至第n行,每行包含三個正整數 x、y、z,表示 x和y之間有一條權值為z的邊。

僅一行,包含乙個數字,為最長路徑的長度。

4 1 2 3

2 4 1

1 3 4

【樣例解釋】

2-1-3這條路徑,長度為3 xor 4 = 7。

【資料範圍】

對於 30%的資料,n<=1000;

對於 70%的資料,n<=40000;

對於 100%的資料,2<=n<=200000,保證輸入資訊給定的是一棵樹,每條邊的權值不大於 10^9。

設dist(x)為樹上一點到根的路徑,則i,j的路徑長度為dist(i)+dist(j)-2*dist(lca)。

根據異或的性質,不難得出在本題中i,j的路徑為dist(i)^dist(j)。

因此問題轉化為在樹上求乙個點對(i,j),使其距離的異或值最大。

不妨將每個點的距離按照二進位制位建成一顆trie樹,列舉每個點,每次貪

心在樹上尋找最佳匹配即可。

由於trie樹的深度為logn,因此最終時間複雜度為o(nlogn)。

#include 

#include

using

namespace

std;

const

int maxn=2e5+10;

int n,ans;

int head[maxn],dis[maxn],tot;

struct edgee[maxn<<1];

int cnt;

struct trietree[maxn*20];

int getint()

void insert(int u,int v,int value)

void update(int x)

else

}}void dfs(int x,int fa)

}int match(int x)

return res;

}int main()

dfs(1,0);

for(int i=1;i<=n;i++) ans=max(ans,match(dis[i]));

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

return

0;}

2012 noip提高 Vigen re 密碼

16 世紀法國外交家 blaise de vigen reblaisedevigene re 設計了一種多表密碼加密演算法 vigen revigene re 密碼。vigen revigene re 密碼的加密解密演算法簡單易用,且破譯難度比較高,曾在美國南北戰爭中為南軍所廣泛使用。在密碼學中,我...

NOIP模擬 路徑

題目描述 樣例輸入1 2 2 x 樣例輸出1 0.888889 樣例輸入2 3 3 x.樣例輸出2 2.000000 資料規模 對於 30 的資料 n,m 50 對於 100 的資料 2 n,m 10 題目分析 1 不考慮障礙時,在矩陣裡,最短距離就是行數差加列數差,可以對應到以起點 終點為頂點的矩...

NOIP2012模擬10 25 旅行

給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...