首页 > TAG信息列表 > P4551
【P4551 最长异或路径】题解
题目链接 题目 给定一棵 \(n\) 个点的带权树,结点下标从 \(1\) 开始到 \(n\)。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 思路 预处理每个点到根节点路劲的异或和,建一棵01trie树。 对于每个节点,在trie树上找离它最远的节点,最【做题记录】P4551 最长异或路径
\(\text{P4551}\) 最长异或路径 算法:\(\text{trie}\) 题目: 给你一棵带边权的树,求 \((u,v)\) 使得 \(u\) 到 \(v\) 的路径上的边权异或和最大,输出这个最大值。 点数不超过 \(10^5\),边权在 \([0,2^{31})\) 内。 题解: 设 \(f(u,v)\) 为 \(u\) 到 \(v\) 的路径上的边权异或和的P4551 最长异或路径 题解
题面 给一棵边带权的树,求一条路径使得路径上所有边的异或最大. 容易发现abb=a,所以可以将两条重合的异或路径合并而不影响结果.考虑求出从根节点到每个节点的异或值,将这些值放进0/1trie树里,从高位贪心即可. 注意:根据讨论结果,还是将初始tot和now赋成1比较好,并且中间变量要取[P4551] 最长异或路径 题解
过程 手写利用DFS求出每个点到根节点的异或距离 不难得出 xor_dis[x][y]=xor_dis[0][x]^xor_dis[0][y] 于是树上异或问题转换成了Trie上异或问题。 代码 直接看代码吧,注释很全 #include <iostream> #include <cstdio> using namespace std; const int N=1e6+128; namespace G {P4551 最长异或路径
求树上两点使得两点路径xor和最大,可以用01字典树维护。 假设1为根,d[i]表示1~i路径上xor和,每次查询x,y路径的xor和就是d[x] xor d[y],因为连续异或两个数字会抵消,相当于1~lca(x,y)的贡献消失了,那剩下的就是x到y的路径异或和 #include<iostream> #include<cstdio> #define rep(i,j,k)洛谷P4551 最长异或路径(01Trie)
题目描述 给定一棵nn个点的带权树,结点下标从11开始到NN。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数NN,表示点数。 接下来 n−1n−1 行,给出 u,v,wu,v,w ,分别表示树上的 uu 点和 vv 点有连边,边的权值P4551 最长异或路径 题解
淦,异或的性质必须要熟悉啊!!! 一个完美的性质:$a\oplus b\oplus b=a$ 于是,对于一个路径$d(x,y)$,必然有$d(x,y)=d(x,root)\oplus d(root,y)$,其中$d(x,y)$表示x到y路径的异或和 接着正解就呼之欲出了: 对于每一个节点$u$,我们均可以计算出其到根节点的异或和,而答案就是$\sum_{i!=j}max\{洛谷P4551 最长异或路径
传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大。 一种很不错的做法是将n个数按二进制从最高位到低位建立一个trie树,然后把m放在trie树上跑一遍。 因为是从高位到低位存的,所以对于每一位,