过程

手写利用DFS求出每个点到根节点的异或距离

不难得出

xor_dis[x][y]=xor_dis[0][x]^xor_dis[0][y]

于是树上异或问题转换成了Trie上异或问题。

代码

直接看代码吧,注释很全

#include <iostream>
#include <cstdio>
using namespace std; const int N=1e6+128;
namespace G
{
struct Edge
{
int to;
int next;
unsigned int val;
} egde[N];
int deg=0; int head[N]; inline void add_edge(int from,int to,unsigned int val)
{
egde[++deg].next=head[from];
egde[deg].to=to;
egde[deg].val=val; head[from]=deg;
} unsigned int dis[N]; // 用来表示 1 节点到 n 节点 xor路径 void dfs(int x,unsigned int val)
{
dis[x]=val;
for(int i=head[x]; i!=0; i=egde[i].next)
dfs(egde[i].to,val^egde[i].val);
}
} namespace trie
{
struct Node
{
Node * next[2];
} trie[N];
int m; inline Node * NEW()
{
return &trie[m++];
} inline int getbit(unsigned int val,int addr)
{
return (val>>(addr-1))&1;
} void insert(unsigned int val,int n,Node * trie_node)
{
if(n==0)
return ;
int c=getbit(val,n);
if(trie_node->next[c]==NULL)
trie_node->next[c]=NEW();
insert(val,n-1,trie_node->next[c]);
} void FindMaxVal(unsigned int &buffer_num,int n,Node * trie_node)
{
if(n==0)
return ;
int c=getbit(buffer_num,n);
if(trie_node->next[c^1]!=NULL) //c^1 该位为1
{
buffer_num|=1<<(n-1);
FindMaxVal(buffer_num,n-1,trie_node->next[c^1]);
} else { // 为 0
buffer_num^=c<<(n-1); //c=c^c==0
FindMaxVal(buffer_num,n-1,trie_node->next[c]);
}
} } int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<n; i++) //n个点只有 n-1条边
{
int u,v;
unsigned w;
scanf(" %d %d %u",&u,&v,&w);
G::add_edge(u,v,w);
}
G::dfs(1,0); trie::NEW(); for(int i=1;i<=n;i++)
trie::insert(G::dis[i],32,&trie::trie[0]); unsigned int maxn=0; //这里有个重要结论 xor_dis[x][y]=xor_dis[0][x]^xor_dis[0][y]; for(int i=1;i<=n;i++)
{
unsigned int t=G::dis[i];
trie::FindMaxVal(t,32,&trie::trie[0]);
maxn=max(maxn,t);
} printf("%u",maxn);
}

[P4551] 最长异或路径 题解的更多相关文章

  1. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  2. P4551 最长异或路径

    题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...

  3. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  4. P4551 最长异或路径 (01字典树,异或前缀和)

    题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...

  5. Luogu P4551 最长异或路径

    题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...

  6. 洛谷P4551 最长异或路径

    传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...

  7. 2018.10.26 洛谷P4551 最长异或路径(01trie)

    传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cst ...

  8. Luogu P4551 最长异或路径 01trie

    做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio&g ...

  9. luoguP4551最长异或路径

    P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...

  10. 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径

    最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...

随机推荐

  1. Fasfdfs搭建

    目录 介绍 参考 tracker-server: storage-server: group: meta data: 部署 FastDfs服务架构图 本地部署服务 安装 libfastcommon 和 ...

  2. 【Azure 应用服务】在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢?

    问题描述 在Azure上部署一套VUE框架的单页面应用,有什么可以参考的文档呢? 问题回答 Azure官方上并没有VUE框架的实例代码,但是可以参考Node JS项目,来进行设置. 在 Azure 中 ...

  3. stm32OLED多级菜单

    今天实现了OLED多级菜单的显示.我用的是stm32f103ve,和四脚的OLED屏幕,用了三个按键. 话不多说,直接上代码. 点击查看代码 //先定义按键功能结构体 typedef struct { ...

  4. centos7通过配置hosts.allow和hosts.deny限制登陆

    etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务. 我们通常只对管理员开放SSH登录, ...

  5. GoLand打开后Project消失

    一直用的好好的Goland,突然不能用了,左边栏Project"消失"了. 如下: 解决方法 遇到上面问题,一般情况是GoLand的cache问题,这个时候要将GoLand清理一下 ...

  6. Jetpack Compose(3) —— 状态管理

    上一篇文章拿 TextField 组件举例时,提到了 State,即状态.本篇文章,即讲解 State 的相关改概念. 一.什么是状态 与其它声明式 UI 框架一样,Compose 的职责非常单纯,仅 ...

  7. C#版开源免费的Bouncy Castle密码库

    前言 今天大姚给大家分享一款C#版开源.免费的Bouncy Castle密码库:BouncyCastle. 项目介绍 BouncyCastle是一款C#版开源.免费的Bouncy Castle密码库, ...

  8. vscode 批量函数前加const 正则表达式替换

    需求 有200多个函数,我要在前面加const devService_importCertificate_result = function (args) { 方案 vscode 替换 打开正则的图标 ...

  9. CYQ.Data 操作 Redis 性能测试:对比 StackExchange.Redis

    前言: 前几天,点开自己的博客,看了一下 CYQ.Data V5系列 都有哪些文章, 发现了一篇2019年写的:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试,于是 ...

  10. [置顶] java.io.IOException: No such file or directory解决方案之权限问题

    先贴出异常信息: java.io.IOException: No such file or directory at java.io.UnixFileSystem.createFileExclusiv ...