过程

手写利用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. python中操作csv

    示例 import csv with open('t.csv', mode='r', encoding='utf-8') as f: reader_obj = csv.reader(f) # 通过re ...

  2. 【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链

    问题描述 在Azure中连接 Service Bus 服务发送消息时发生证书错误,抛出证书异常消息: 或 The X.509 certificate CN=servicebus.chinaclouda ...

  3. 【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值

    问题描述 对于PaaS的Azure Cache for Redis,Azure中有哪些监控方式?是否能有api接口调用来获取监控值? 问题答案 1) 在Redis的门户中,使用Metrics查看Red ...

  4. 为什么HashMap的键值可以为null,而ConcurrentHashMap不行?

    写在开头 昨天在写<HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!>这篇文章的时候,漏了一个知识点,知道晚上吃饭的时候才凸显想到,关于Concur ...

  5. kotlin协程小记

    转载请标明出处:https://www.cnblogs.com/tangZH/p/16849169.html -[kotlin协程小记]-[协程的async使用]- [kotlin协程异常处理之-tr ...

  6. UI自动化测试中图片验证码的处理?

    首先定位验证码image的元素,然后通过element.screenshot('a.png')截图保存到本地,通过第三方接口识别本地图片验证码

  7. XAF Blazor FilterPanel

    前言 XAF列表视图(ListView)中的过滤(Filter),可以在ListView模型的Filters节点中添加,添加的过滤项(FilterItem)会在列表视图的工具栏中以下拉列表的形式显示, ...

  8. springMVC之对象中的基本类型数据绑定遇到的问题

    最进在开发关于SpringMVC框架的项目时,发现个数据绑定的问题,如果这个实体对象里的字段类型为long.int.double时,客户端就报400语法错误 源代码: controller: @Req ...

  9. jquery之ajax中文乱码解决方案

    $.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: ...

  10. [原创] KCP 源码分析(上)

    KCP 协议是一种可靠的传输协议,对比 TCP 取消了累计确认(延迟 ACK).减小 RTO增长速度.选择性重传而非全部重传.通过用流量换取低时延. KCP 中最重要的两个数据结构IKCPCB和IKC ...