POJ3764,BZOJ1954 The xor-longest Path
题意
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. Given an edge-weighted tree with n nodes, can you find the xor-longest path?
给一颗边权树,求出树上最长的异或和路径.
分析
参照jklover的题解。
利用异或的优秀性质,可以处理出节点 1 到每个点的距离 dis ,那么 u 和 v 之间的异或和距离直接就是 dis[u] ^ dis[v] .被重复计算的部分自身异或两次抵消了.
那么将 dis 数组求出后,问题就变为在这个数组中找两个数,使得这对数异或值最大.
使用 Trie 树的经典做法解决即可.
时间复杂度:31倍线性。
代码
POJ用vector会TLE,只能自己写边表。
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
template<class T>il T read(rg T&x)
{
return x=read<T>();
}
typedef long long ll;
using namespace std;
co int N=1e5+1,L=N*31;
int tot,root,ch[L][2],bin[31];
void turn(int x)
{
for(int i=0;i<=30;++i,x>>=1)
bin[i]=x&1;
}
int newnode()
{
++tot;
memset(ch[tot],0,sizeof ch[tot]);
return tot;
}
void ins()
{
int u=root;
for(int i=30;i>=0;--i)
{
if(!ch[u][bin[i]])
ch[u][bin[i]]=newnode();
u=ch[u][bin[i]];
}
}
int find()
{
int u=root,res=0;
for(int i=30;i>=0;--i)
{
if(ch[u][bin[i]^1])
res+=(1<<i),u=ch[u][bin[i]^1];
else
u=ch[u][bin[i]];
}
return res;
}
typedef pair<int,int> pii;
struct edge // edit 2: slow vector
{
int to,nx,w;
}e[N*2];
int ecnt,h[N],v[N];
void add(int x,int y,int w)
{
e[++ecnt].to=y,e[ecnt].w=w;
e[ecnt].nx=h[x],h[x]=ecnt;
}
void dfs(int x,int fa,int val)
{
for(int i=h[x];i;i=e[i].nx)
{
int y=e[i].to;
if(y==fa) continue;
dfs(y,x,v[y]=val^e[i].w);
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n;
while(scanf("%d",&n)!=EOF) // edit 1: several test cases
{
tot=0,root=newnode();
ecnt=0;
fill(h+1,h+n+1,0);
for(int i=1;i<n;++i)
{
int u=read<int>()+1,v=read<int>()+1,w=read<int>();
add(u,v,w),add(v,u,w);
}
v[1]=0;dfs(1,0,0);
turn(v[1]);ins();
int ans=0;
for(int i=2;i<=n;++i)
{
turn(v[i]);ins();
ans=max(ans,find());
}
printf("%d\n",ans);
}
return 0;
}
POJ3764,BZOJ1954 The xor-longest Path的更多相关文章
- poj3764 The XOR Longest Path【dfs】【Trie树】
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10038 Accepted: ...
- 题解 bzoj1954【Pku3764 The xor – longest Path】
做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...
- Solve Longest Path Problem in linear time
We know that the longest path problem for general case belongs to the NP-hard category, so there is ...
- Why longest path problem doesn't have optimal substructure?
We all know that the shortest path problem has optimal substructure. The reasoning is like below: Su ...
- BZOJ1954: Pku3764 The xor-longest Path
题解: 在树上i到j的异或和可以直接转化为i到根的异或和^j到根的异或和. 所以我们把每个点到根的异或和处理出来放到trie里面,再把每个点放进去跑一遍即可. 代码: #include<cstd ...
- FB面经Prepare: Find Longest Path in a Multi-Tree
给的多叉树, 找这颗树里面最长的路径长度 解法就是在子树里面找最大的两个(或一个,如果只有一个子树的话)高度加起来. 对于每一个treenode, 维护它的最高的高度和第二高的高度,经过该点的最大路径 ...
- SP1437 Longest path in a tree(树的直径)
应该是模板题了吧 定义: 树的直径是指一棵树上相距最远的两个点之间的距离. 方法:我使用的是比较常见的方法:两边dfs,第一遍从任意一个节点开始找出最远的节点x,第二遍从x开始做dfs找到最远节点的距 ...
- Educational DP Contest G - Longest Path (dp,拓扑排序)
题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...
- [LeetCode] Longest Univalue Path 最长相同值路径
Given a binary tree, find the length of the longest path where each node in the path has the same va ...
随机推荐
- centos7没有安装ifconfig命令的解决方法(转)
ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...
- scala学习手记18 - Any和Nothing
Any 前面已经有两次提到过:在scala中,Any类是所有类的超类. Any有两个子类:AnyVal和AnyRef.对应Java直接类型的scala封装类,如Int.Double等,AnyVal是它 ...
- 【C#基本功 控件的用法】 委托
接触C#这段时间,很多内容容易理解,但也也有很多内容总是无法踏过门槛,就像Delegate 委托,这种新的机制是Labview不具备的,他的一个用法,也让我们这些从labview跨越过来的coder, ...
- 安装(解密)win10 10074 esd 更新 10162 esd
最新ESD:http://ms-vnext.net/Win10esds/ 公开下载:http://ms-vnext.net/Win10esds/urls/ ----------------更新 --- ...
- 前端工程师(JavaScript)在业余时间如何提高自身能力
1.前端工程师(JavaScript)在业余时间如何提高自身能力? https://www.zhihu.com/question/40186398?sort=created 2.前端开发工程师必读书籍 ...
- 对CSS了解-选择器权重
<style type="text/css"> div.ui_infor p {font-size: 16px;} .ui_infor p {font-size: 14 ...
- Win7 x64安装Paramiko
先说一下我的环境: win7 x64 旗舰版.Python3.5.0.pip8.1.0 pip install paramiko时报错如下: 大概意思: blablabla... 反正大概意思就是少G ...
- docker 创建镜像,并推送到私有仓库
创建镜像 创建 Dockerfile 镜像命名规则:registyr_url / namespace / depart / name : version 用这个规则创建的镜像,可直接推送到私有仓库 ...
- 记录下一次错误报http请求500,
1.请求控制层没问题,能请求到,如果缺少参数都会返回提示信息,但是请求参数都对了以后,居然报500,非常不解 找了好久,不知道哪里错了,最后经理提示是不是有可能,mapper.xml出错了,最后,我将 ...
- Android中Application是什么?
Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象, ...