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 ...
随机推荐
- 跳出弹窗页面禁止滚动(PC端和手机端)
pc端如何实现 1.当弹窗显示时,为body元素添加属性:overflow:hidden, 当关闭弹窗时移除该属性即可2.在弹窗的div上设置 @scroll.stop.prevent 3.前端页面弹 ...
- 20145109 《Java程序设计》第四周学习总结
20145109 <Java程序设计>第四周学习总结 教材学习内容总结 Chapter 6 Inheritance & Polymorphism What is Inheritan ...
- Percona 工具包 pt-online-schema-change 简介
mysql的在线表结构修改,因为低效和阻塞读写.一直被诟病.至于ALTER TABLE 的原理,参看我上一篇文章.MySQL在线修改大表结构.看完后,发现的问题是还是会锁的,且对于在线更新的这块也是不 ...
- TCP_AIO_Server_ZC_01
ZC: 这个例子是,1个skt 投递 1个未决的接收操作 1.package aio.Client; 1.1.这是一个 测试的客户端的代码: package aio.Client; import ja ...
- css滚动相关问题记录
1) 关于滑动加速优化,可以通过css进行处理 例如,html如下: <div class="content-dialog"> <h1>活动规则</h ...
- centos下使用fdisk扩展分区容量大小
硬盘空间为20G,VMware增加磁盘大小,需要再增加10G空间 扩展完后,重启系统,再次使用fdisk -l查看,会发现硬盘空间变大了: 重新创建分区,调整分区信息 本次实验主要对/dev/sda4 ...
- Appium 自动化测试(5)-- Appium详细介绍:Appium 手机自动化测试_TesterHome公开版pdf
- Dubbo定义及其作用
Dubbo定义 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只 ...
- Annotation: 代码的修饰符
Table of Contents 简介: 是什么, 用途, 为什么有用 使用: 一个简单例子,如@Override.系统提供的annotation,做成列表 定义新的annotation. 涉及到的 ...
- Updated: EBS 12.1 + Transportable Tablespaces with Incremental Backup Option
Database migration across platforms of different "endian" (byte ordering) formats using th ...