題目鏈結
戳我前置知識
什麼是異或? -----如果二進位制下同一位不相同,則為\(1\),否則為\(0\)
trie樹
基本位運算
對於同一條邊異或兩次,相當於沒有進行異或,我們將dis[i]表示為從i點到根節點的路徑異或和。則問題轉化為了求兩點的dis異或最大值
貪心的想,對於乙個數x,我們對於dis[i]^x最大,則每次往x相反的值選。
及如果x這一位是1,我們在trie樹上往0跑,反之往1跑。這樣的一定是最大的。
code
#include#define int ll
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
typedef long long ll;
const int n=1000010;
int read()
int dis[n],head[n],cnt,tot=1;
struct node b[n<<1];
void dfs(int x,int fa)
}void add(int x,int y,int v)
struct node1 a[n<<2];
void build(int x)
}int find(int x)
return ans;
} main()
最長異或路徑 trie樹 題解
題意 給你一棵樹,有邊權,定義兩點之間的價值為這連線兩點的這條路徑上所有邊權的異或和,如1 2 1 rightarrow 2 1 2所經過的邊權為1,2 31,2,3 1,2,3,那麼1 2 1 rightarrow 2 1 2的權值就為1 2 3 3 1 bigoplus2 bigoplus3 3...
Luogu4551 最長異或路徑
emmmmmmmmmm異或乙個數兩次等於沒有操作對吧。所以我們按照字首的異或和,建乙個01trie。然後之後。直接在樹上貪心地找能和它每一位不一樣的數。然後。就沒有了吧qwqwq 如下 include include include include include define maxn 10001...
Acwing 144 最長異或值路徑
144.最長異或值路徑 給定乙個樹,樹上的邊都具有權值。樹中一條路徑的異或長度被定義為路徑上所有邊的權值的異或和 為異或符號。給定上述的具有n個節點的樹,你能找到異或長度最大的路徑嗎?輸入格式 第一行包含整數n,表示樹的節點數目。接下來n 1行,每行包括三個整數u,v,w,表示節點u和節點v之間有一...