洛谷 P4551 最長異或路徑

2022-05-07 22:12:07 字數 1264 閱讀 7425

首先我們知道,例如1為根,假設存在這樣三條邊:1-2,2-3,2-4,那麼,路徑(3,4)的值等於(1,3)^(1,4)

那麼我們現在可以得到以1為端點,1到n為另一端點的n條邊,和這n條路徑的異或和值的集合s,我們現在就是要找兩個端點x,y,使路徑(x,y)的值最大,即(1,x)^(1,y)值最大,

換而言之,就是要找集合s中哪兩個點異或值最大

這就是01字典樹的套路了,從01字典樹頂點開始,走兩條路一直走到n,同一層盡量保證一邊是0,另一邊是1

具體思路詳見**

題目描述

給定一棵nnn個點的帶權樹,結點下標從111開始到nnn。尋找樹中找兩個結點,求最長的異或路徑。

異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。

輸入格式

第一行乙個整數nnn,表示點數。

接下來 n−1n-1n−1 行,給出 u,v,wu,v,wu,v,w ,分別表示樹上的 uuu 點和 vvv 點有連邊,邊的權值是 www。

輸出格式

一行,乙個整數表示答案。

輸入輸出樣例

輸入 #1

41 2 3

2 3 4

2 4 6

輸出 #1

說明/提示

最長異或序列是1-2-3,答案是 7 (=3 ⊕ 4)

資料範圍

1≤n≤100000;0#include#define ll long long

#define mod 998244353

#define maxn 833333

using namespace std;

#includell tre[maxn][3],id=0,sum[maxn][3];

struct node

;vectore[maxn];

void add(ll x)

}void dfs(ll u,ll fa,ll s)

}ll dfs1(ll step,ll cx,ll cy)

if((tre[cx][1]>0&&tre[cy][0]>0))

}else

else

}return ans+mx;

}int main()

); e[v].push_back();

}dfs(1,-1,0);

ll ans=dfs1(40,tre[0][0],tre[0][0]);

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

}

洛谷P4551 最長異或路徑

題目大意 求樹上最長的異或路徑 題解 由於異或具有自反性,只需要求出每個節點到根的異或長度,塞進 trie 裡,最後對每個節點找一下最大值更新答案即可 卡點 把動態開點寫成了可持久化,然後空間要再多開一點 比層數多一 c code include include define m 30 define...

題解 P4551 最長異或路徑

給定一棵 n 個點的帶權樹,結點下標從 1 開始到 n 尋找樹中找兩個結點,求最長的異或路徑。異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。include include define m 200070 define n 5000070 using namespace std struct...

Luogu4551 最長異或路徑

emmmmmmmmmm異或乙個數兩次等於沒有操作對吧。所以我們按照字首的異或和,建乙個01trie。然後之後。直接在樹上貪心地找能和它每一位不一樣的數。然後。就沒有了吧qwqwq 如下 include include include include include define maxn 10001...