洛谷P4551 最長異或路徑

2022-05-23 22:24:14 字數 862 閱讀 7623

題目大意:求樹上最長的異或路徑

題解:由於異或具有自反性,只需要求出每個節點到根的異或長度,塞進$trie$裡,最後對每個節點找一下最大值更新答案即可

卡點:把動態開點寫成了可持久化,然後空間要再多開一點(比層數多一)

c++ code:

#include #include #define m 30

#define maxn 100010

#define n (maxn * (m + 1))

int head[maxn], cnt;

struct edge e[maxn << 1];

inline void addedge(int a, int b, int c) ; head[a] = cnt;

e[++cnt] = (edge) ; head[b] = cnt;

}int nxt[n][2], root, idx;

void insert(int &rt, int x, int dep)

int query(int x)

return res;

}int n, dis[maxn];

void dfs(int u, int fa = 0) }}

int main()

dfs(1);

int ans = 0;

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

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

return 0;

}

洛谷 P4551 最長異或路徑

首先我們知道,例如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 值最大,換而言之...

題解 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...