传送门


题目大意:给定一棵 n 个点的带权树,求树上最长的异或和路径。


对于树上从x到y的路径的异或和,表示为 D(x,y)D(x,y)D(x,y),则有:
D(x,y)=D(1,x)⊕D(1,y)D(x,y)=D(1,x) \oplus D(1,y)D(x,y)=D(1,x)⊕D(1,y)
而所有的D(1,i)D(1,i)D(1,i)是可以O(n)O(n)O(n)求出的。

问题转化为在N-1个数中找出两个数,使他们异或运算的结果最大。

我们把所有的D(1,i)D(1,i)D(1,i)用二进制表示并补足32位,从高位向低位插入Trie树中,在插入之前先求出当前树与前i-1个异或的最大值,即贪心地尽量使同一位上的数不同,没有时才往相同的点走,更新答案。


Code:

#include<bits/stdc++.h>
using namespace std;struct edge{int y,c,next;
}a[200010];int first[100010];
struct node{int son[2];node(){son[0]=son[1]=-1;}void clear(){son[0]=son[1]=-1;}
}tr[3100010];
int v[100010];
int n,len,x,y,c;
long long ans;void ins(int x,int y,int c){a[++len]=(edge){y,c,first[x]};first[x]=len;
}
void bt(int x)
{int now=0,p;for(int i=31;i>=0;i--){if(x&(1<<i)) p=1;else p=0;if(tr[now].son[p]==-1)tr[now].son[p]=++len;now=tr[now].son[p];}
}
void cal(int x)
{int now=0,p;long long sum=0;for(int i=31;i>=0;i--){if(x&(1<<i)) p=1;else p=0;if(tr[now].son[!p]!=-1)sum|=(1<<i);else p=!p;now=tr[now].son[!p];}ans=max(ans,sum);
}
void dfs(int x,int fa,int val)
{for(int i=first[x];i;i=a[i].next){int y=a[i].y;if(y==fa) continue;dfs(y,x,v[y]=val^a[i].c);}
}int main()
{while(scanf("%d",&n)!=EOF){for(int i=0;i<=len;i++)   tr[i].clear();memset(first,len=0,sizeof first);for(int i=1;i<n;i++){scanf("%d %d %d",&x,&y,&c);x++;y++;ins(x,y,c);ins(y,x,c);}len=0;v[1]=0;dfs(1,0,0);ans=0;bt(v[1]);for(int i=2;i<=n;i++){cal(v[i]);bt(v[i]);}printf("%lld\n",ans);}
}

POJ 3764 The xor-longest Path相关推荐

  1. POJ 3764 Language: The xor-longest Path (01字典树+DFS)

    传送门:POJ 3764 题目大意: 在树上找一段路径(连续)使得边权相异或的结果最大. 前置技能: 1.用链式前向星建图. 2. 01字典树的应用. 思路: 本题用 vector数组建图是会超时的, ...

  2. Trie:hdu 4825、1251、1247、Poj 3764

    hdu 4825链接 题目意思很简单,就是要求最大异或值的数. 我们可以从二进制的最高位开始选择,不断的排除一些数.我们先假设存在某些数字的二进制数是与当前查找的数不一样的,我们进入这一部分数进行查找 ...

  3. POJ - 3764 The xor-longest Path(字典树性质)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个边权,现在问能否选择两个点,使得其间路径上的异或和最大 题目分析:直接求肯定是比较复杂的,我们可以转换一下题意,因为是一棵树,所以n个点肯定互 ...

  4. 【POJ - 2373】Dividing the Path(单调队列优化dp)

    题干: Farmer John's cows have discovered that the clover growing along the ridge of the hill in his fi ...

  5. 2021牛客国庆集训派对day1 H - Longest Path

    Description 给你一棵树,边有边权, 定义一条从u到v的路径,这一路上经过的点为e1,e2,...,eke_1,e_2,...,e_ke1​,e2​,...,ek​ 定义这条路径的权值f(u ...

  6. 【Leetcode】2246. Longest Path With Different Adjacent Characters

    题目地址: https://leetcode.com/problems/longest-path-with-different-adjacent-characters/ 给定一棵 n n n个节点的有 ...

  7. 【读书笔记】《算法竞赛进阶指南》读书笔记——0x10基本数据结构

    to do(perhaps never) CH1401 后缀数组 所有课后题 栈 例题:HDU4699 Editor 维护一个整数序列的编辑器,支持以下五种操作: I x:在当前光标位置处插入一个整数 ...

  8. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  9. Cow Contest POJ - 3660 And Longest Paths UVA - 10000(弗洛伊德的应用)

    Problem Description N ( 1 ≤ N ≤ 100 ) N (1 ≤ N ≤ 100) N(1≤N≤100) cows, conveniently numbered 1.. N 1 ...

  10. poj 1383 Labyrinth

    题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...

最新文章

  1. 石川es6课程---7、数组
  2. assembly x86(nasm)串比较
  3. Oracle 查看 对象 持有锁的情况
  4. SpringDataJpa报错: Table 'XX.hibernate_sequence' doesn't exist
  5. yelee主题中加入revolvermaps插件
  6. Feign数据压缩传输
  7. IOS UIPageController
  8. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
  9. 【学习笔记】常用的c/c++面试题
  10. C#WinForm实现对前一篇文章中的SFTP工具类的使用
  11. JADE(Java Agent Development Framework)笔记
  12. 申请微信公众号平台流程
  13. 贵圈似乎有点乱:“5G手机”居然比5G网络先到了?
  14. python-恩尼格码密码机实现
  15. ACL2019之对话系统
  16. mac版python怎么运行_mac 怎么运行python
  17. 腾讯单点登录系统跨域劫持漏洞
  18. js使用双层for循环实现倒三角形、正三角形
  19. 【基础知识】~ 半加器 全加器
  20. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(十二)

热门文章

  1. 正态分布(Normal Distribution)
  2. VBA自动创建数据透视表
  3. 大学毕业后拉开差距的真正原因
  4. web前端@css选择器
  5. pandas 列计算log不用math.log而是np.log
  6. 《皇帝内经》养生法则
  7. 什么是 Win10 五月更新版?附Win10 1903更新文件下载
  8. 腾讯云直播流程及腾讯云通讯功能整理
  9. BZOJ4874:筐子放球
  10. 巧用 Automator,为 Mac 创建自定义右键菜单