emmmmmmmmmm異或乙個數兩次等於沒有操作對吧。。。所以我們按照字首的異或和,建乙個01trie。。。。。然後之後。。。。。直接在樹上貪心地找能和它每一位不一樣的數。。。。然後。。。。就沒有了吧qwqwq
**如下:
#include#include#include#include#include#define maxn 100010
using namespace std;
int n,t,cnt=1;
int sum[maxn],head[maxn],ch[maxn*31][2];
int ans=0;
struct edgeedge[maxn<<1];
inline void add(int from,int to,int dis)
inline void init(int x,int pre)
}inline void insert(int x)
}inline int get_ans(int x)
return cur_ans;
}int main()
init(1,1);
for(int i=1;i<=n;i++) insert(sum[i]);
for(int i=1;i<=n;i++) ans=max(ans,get_ans(sum[i]));
printf("%d\n",ans);
return 0;
}
題解 P4551 最長異或路徑
給定一棵 n 個點的帶權樹,結點下標從 1 開始到 n 尋找樹中找兩個結點,求最長的異或路徑。異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。include include define m 200070 define n 5000070 using namespace std struct...
洛谷 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 最長異或路徑
題目大意 求樹上最長的異或路徑 題解 由於異或具有自反性,只需要求出每個節點到根的異或長度,塞進 trie 裡,最後對每個節點找一下最大值更新答案即可 卡點 把動態開點寫成了可持久化,然後空間要再多開一點 比層數多一 c code include include define m 30 define...