过程

手写利用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. webservice之jersey简单实用

    前言 项目中更需要使用到webservice,具体的是使用jersey.那么首先需要了解jersey和webservice的关系,捋顺webservice框架的各种实现,通过查阅相关博客,我个人总结w ...

  2. 【Azure 应用服务】在App Service中新建WebJob时候遇见错误,不能成功创建新的工作任务

    问题描述 在Azure App Service界面上,添加新的Web Job(工作任务)时,一直添加失败.无详细错误提示,在App Service的Activity Logs(活动日志)中,根本没有添 ...

  3. Java 常用类 String的使用---测试

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * 8 * 9 * @author Bytez ...

  4. 小工具 --- 百度翻译API翻译工具

    引言 最近想把一些英文官方文档的资料翻译成中文,然后转化为Markdown文档,然后发现百度通用翻译的API有不错的免费额度,个人申请也能申请到高级版.这个额度足够个人的日常使用了. 如何使用 如何使 ...

  5. 我的电脑 属性 代理 win10 不用的时候记得关闭,git python node 等

  6. IIS web.config 跨域设置 不包含 options的设置 thinkphp tp3 跨域

    web.config <?xml version="1.0" encoding="UTF-8"?> <configuration> &l ...

  7. GO 语言的并发编程相关知识点简介与测试【GO 基础】

    〇.什么是协程 Coroutines ? 进程和线程太常见,本文就不再赘述了,直接一起看下什么是协程.如下图,先看下协程的定位: 关于用户空间和内核空间:进程运行起来就涉及到对内存资源的管理,然而内存 ...

  8. PyQt5 Ubuntu 16.04/14.04 环境配置

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. linux使用hostapd+dnsmasq管理多张网卡,搭建dns服务器,并发射wifi热点(支持360wifi等等)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2015-03-03 18:37:39 ...

  10. union all 优化案例

    遇到个子查询嵌套 UNION ALL 的SQL语句很慢,谓词过滤条件不能内推进去,需要优化这段 UNION ALL这块的内容. UNION ALL 慢SQL: SELECT * FROM ((SELE ...