[P4551] 最长异或路径 题解
过程
手写利用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] 最长异或路径 题解的更多相关文章
- [luogu] P4551 最长异或路径(贪心)
P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...
- P4551 最长异或路径
题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- Luogu P4551 最长异或路径
题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...
- 洛谷P4551 最长异或路径
传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...
- 2018.10.26 洛谷P4551 最长异或路径(01trie)
传送门 直接把每个点到根节点的异或距离插入01trie. 然后枚举每个点在01trie上匹配来更新答案就行了. 代码: #include<iostream> #include<cst ...
- Luogu P4551 最长异或路径 01trie
做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio&g ...
- luoguP4551最长异或路径
P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
随机推荐
- python中操作csv
示例 import csv with open('t.csv', mode='r', encoding='utf-8') as f: reader_obj = csv.reader(f) # 通过re ...
- 【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链
问题描述 在Azure中连接 Service Bus 服务发送消息时发生证书错误,抛出证书异常消息: 或 The X.509 certificate CN=servicebus.chinaclouda ...
- 【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
问题描述 对于PaaS的Azure Cache for Redis,Azure中有哪些监控方式?是否能有api接口调用来获取监控值? 问题答案 1) 在Redis的门户中,使用Metrics查看Red ...
- 为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
写在开头 昨天在写<HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!>这篇文章的时候,漏了一个知识点,知道晚上吃饭的时候才凸显想到,关于Concur ...
- kotlin协程小记
转载请标明出处:https://www.cnblogs.com/tangZH/p/16849169.html -[kotlin协程小记]-[协程的async使用]- [kotlin协程异常处理之-tr ...
- UI自动化测试中图片验证码的处理?
首先定位验证码image的元素,然后通过element.screenshot('a.png')截图保存到本地,通过第三方接口识别本地图片验证码
- XAF Blazor FilterPanel
前言 XAF列表视图(ListView)中的过滤(Filter),可以在ListView模型的Filters节点中添加,添加的过滤项(FilterItem)会在列表视图的工具栏中以下拉列表的形式显示, ...
- springMVC之对象中的基本类型数据绑定遇到的问题
最进在开发关于SpringMVC框架的项目时,发现个数据绑定的问题,如果这个实体对象里的字段类型为long.int.double时,客户端就报400语法错误 源代码: controller: @Req ...
- jquery之ajax中文乱码解决方案
$.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: ...
- [原创] KCP 源码分析(上)
KCP 协议是一种可靠的传输协议,对比 TCP 取消了累计确认(延迟 ACK).减小 RTO增长速度.选择性重传而非全部重传.通过用流量换取低时延. KCP 中最重要的两个数据结构IKCPCB和IKC ...