POJ 3764 DFS+trie树
题意:
给你一棵树,求树中最长的xor路径。(n<=100000)
思路:
首先我们知道 A xor B =(A xor C) xor (B xor C)
我们可以随便选一个点DFS 顺便做出与这个点连接的其它点的xor长度
但是
枚举起点&重点+判断会TLE
所以呢 随后 就是重头戏了:trie树
这是一棵神奇的树 (莫名想到了“这是一个神奇的网站”)
我们可以从高位往低位插这个点的xor的值。(数字前面可以补零)
之后是查找 由于异或的性质,我们可以得到:当此位数字不相同时 xor得到的值最大,那不就好说了嘛。
每回寻找树上有没有与这一位不相同的值的节点
1.若有,w|=(1 << i) 。按此方向向下寻找
2.若没有,继续顺着trie树往下走
注意是多case。
注意清空数组,ans、归零什么的
PoPoQQQ大爷在这里都有惨痛的经历。
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 305000
using namespace std;
int first[N],next[N],v[N],w[N],W[N],trie[N*10][2];
int xx,yy,zz,n,tot,cnt,ans;
bool vis[N];
void add(int x,int y,int z){
v[tot]=y,w[tot]=z;
next[tot]=first[x],first[x]=tot++;
}
void dfs(int x){
for(int i=first[x];~i;i=next[i])
if(!vis[v[i]]){
vis[v[i]]=1;
W[v[i]]=W[x]xor w[i];
dfs(v[i]);
}
}
void insert(int x){
int jy=0;
for(int i=30;i>=0;i--){
int temp=x&(1<<i)?1:0;
if(trie[jy][temp]==0)
trie[jy][temp]=++cnt;
jy=trie[jy][temp];
}
}
int find(int x){
int jy=0,w=0;
for(int i=30;i>=0;i--){
int temp=x&(1<<i)?1:0;
if(trie[jy][!temp])
w|=(1<<i),jy=trie[jy][!temp];
else jy=trie[jy][temp];
}
return w;
}
int main(){
while(~scanf("%d",&n)){
memset(first,-1,sizeof(first));
memset(trie,0,sizeof(trie));
memset(vis,0,sizeof(vis));
memset(W,0,sizeof(W));
ans=tot=cnt=0;
for(int i=1;i<n;i++){
scanf("%d%d%d",&xx,&yy,&zz);
add(xx,yy,zz),add(yy,xx,zz);
}
dfs(xx);
for(int i=0;i<n;i++)insert(W[i]),ans=max(ans,find(W[i]));
printf("%d\n",ans);
}
}
万朵红中一点蓝。
POJ 3764 DFS+trie树的更多相关文章
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
- POJ 2418 简单trie树
Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 21845 Accepted: 8551 De ...
- Colored Sticks POJ - 2513(trie树欧拉路)
题意: 就是无向图欧拉路 解析: 不能用map..超时 在判断是否只有一个联通的时候,我比较喜欢用set,但也不能用set,会超时,反正不能用stl emm 用trie树来编号就好了 #include ...
- POJ - 3764 01字典树+前缀异或和
异或关于前缀的特性:[u,v]=[1,u]^[1,v] 注意是路径,假设1为根,prexor[1]不保留数值 /*H E A D*/ int to[maxn<<1],nxt[maxn< ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- POJ 3764 - The xor-longest Path - [DFS+字典树变形]
题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...
- POJ 3764 The xor-longest Path trie树解决位运算贪心
http://poj.org/problem?id=3764 题意 : 一颗树,每个边有个值,在树上找一条简单路径,使得这条路径上的边权异或值最大 先找到所有节点到一点的距离 , 显然dis( x ...
- Poj 3764 The xor-longest Path(Trie树+xor+贪心)
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6455 Accepted: 1392 ...
- poj 3764 The xor-longest Path(字典树)
题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...
随机推荐
- [转]C++内存管理
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- SqlServer数据库表导入SqlLite数据库表保持日期时间类型字段的格式
在写查询功能的过程中遇到一个这样的问题:按日期范围查询,sql语句是:where dt>=用户选择起始日期&&dt<=用户选择结束日期.数据库中的数据如图1,我选择的测试数 ...
- CSS读书笔记(3)---清除浮动的几种方法
浮动元素容易造成页面错位现象.下面说说关于清除浮动的几种方法. 首先.先创建一个浮动导致错位的页面. <!DOCTYPE html> <html lang="en" ...
- C# 重命名文件方法
. //重命名文件 // 改名方法 FileInfo fi = new FileInfo("旧路径"); //xx/xx/aa.rar fi.MoveTo("新路径&qu ...
- C# 遍历对象下的 属性
foreach (System.Reflection.PropertyInfo p in users.GetType().GetProperties()) { var xx = p.Name; var ...
- CDR教程-海报中的立体星星怎么画
在海报招贴.平面设计中有时需要凸显节日气氛,绘制一些立体星星图案作为陪衬.有人说cdr软件实现不了立体星星的制作,我想说,只有想不到,没有做不到.制作立体星星可通过cdr软件中的某些工具来实现,本案例 ...
- PHP迭代器的内部执行过程
下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理.先来看一个官方的例子: class myIterator implements Iterator { private ...
- kernel相关前沿技术了解
Intel MPX https://en.wikipedia.org/wiki/Intel_MPX SPDK http://aidaiz.com/spdk/ TCMalloc http://goog- ...
- awk一次性分别赋值多个value给多个变量,速度对比
方法 #方法1: echo "apple banana orange" | awk '{print $1,$2,$3}' | while read a b c do echo a= ...
- vim利器:vundle 管理器和NERDTree插件
vundle 和nerdtree vundle git: https://github.com/VundleVim/Vundle.vim.git nerdtree git : https://gith ...