bzoj1954 poj3764】的更多相关文章

对于xor有一个非常重要的性质A xor B xor B=A 并且满足交换律和结合律这道题是求无根树上最长的xor路径我们知道,无根树的题目我们都是要想办法转化为有根树来处理当我们确定了一个根,根到每个节点i的xor路径f[i]可知则在树中,任意两个节点ij间的xor路径长度即为f[i] xor f[j]为什么,利用之前的性质我们可以知道路径长度=d[i,LCA] xor d[LCA,j]=d[i,LCA] xor d[LCA,root] xor d[root,LCA] xor d[LCA,j]…
题意 In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: \[ _{xor}length(p)=\oplus_{e \in p}w(e) \] \(⊕\) is the xor operator. We say a path the xor-longest path if it has the largest xor-length.…
http://poj.org/problem?id=3764 (题目链接) 今天的考试题,看到异或就有点虚,根本没往正解上想.. 题意 给出一棵带权树,请找出树上的一条路径,使其边上权值的异或和最大. solution 首先我们考虑从根向下dfs,记录下每个点i到根上权值的异或和${val[i]}$.根据异或和的性质:${x~Xor~y~Xor~y=x}$.所以我们可以由${val}$数组两两组合得出树上任意两点之间路径的异或和.(不理解请自己脑补OvO) 然而这样对于时间复杂度并没有提高,仍然…
题目 POJ3764 The xor-longest Path 原题传送门 主要思路: 1.求出每个点到根节点(这里是树,所以直接取0)路径上所有权值xor和为d[i],则任意两点间路径xor和则为 d[x]^d[y](至于证明,作者太懒,不想写) 2.接着用trie树跑出 max(d[x]^d[y]) (0<=x<n && 0<=y<n) Code #include<cstdio> #include<cstring> //#include&…
  Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6361   Accepted: 1378 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. We say a path the xor…
题目给一棵有边权的树,问树上任意两点路径上的边异或值最多是多少. 记录每个点u到根路径的异或值xor[u],那么任意两点u.v路径的异或值就是xor[u]^xor[v]. 于是这个问题就变成了从n个数中任取两个数异或,求最大异或值,这是个经典的问题,用字典树解决. 方法就是所有数的二进制形式构建成一棵01字典树,枚举每个数从字典树中就能找到对应的最大的答案. #include<cstdio> #include<cstring> #include<algorithm> u…
代码写了不到30分钟,改它用了几个小时.先说题意,给你一颗树,边上有权,两点间的路径上的路径的边权抑或起来就是路径的xor值,要求的是最大的这样的路径是多少.讲到树上的两点的xor,一个常用的手段就是随便选一个根,然后深搜记下每个点v到根的xor路径 w[v],那么两点x,y路径的xor就是w[x]^w[y]. 深搜一发,问题转化为给你一个数组a,求a中哪两个数的抑或值最大.解决该问题的方法就是Trie树. 对每个权值由二进制高位到低位插到Trie树里,当要询问对于权值x最大的xor的时候,就需…
题解: 在树上i到j的异或和可以直接转化为i到根的异或和^j到根的异或和. 所以我们把每个点到根的异或和处理出来放到trie里面,再把每个点放进去跑一遍即可. 代码: #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #inc…
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值,然后在这些值中找出两个值的异或值最大.是基于这样的一个原理,相同段的异或值为0.这题在树中找两个节点,两个节点间有唯一路径(因为是树),把路径不断做异或,异或完后求最大的.数据是10万,O(n2)算法超时.我们知道异或有这样的性质:a^b = (a^c)^(b^c),这样就可以考虑找出a与b公共的c…
Description: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. Hint: \(n<=10^5\) Solution: 真是01Trie傻逼题,居然想了好久 瓶颈在于如何找出所有的点到根节点的异或值中异或起来最大的两个 考虑将每个点到根节点的异或值插入Trie,再同样地查询一次就行了 #include<bits/stdc++.h> using namespace std; const int mxn=1e7+5; struct ed { i…