博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu_4551【题解】最长异或路径 trie树
阅读量:5329 次
发布时间:2019-06-14

本文共 1228 字,大约阅读时间需要 4 分钟。

题面:

大意:给定一棵 n 个点的带权树,结点下标从 1 开始到 N 。寻找树中找两个结点,求最长的异或路径。

因为 a xor a = 0

所以只需要dfs求一遍所有点到根节点的异或和。

然后改为01串放入trie树中。

因为是异或操作,所以当这个节点为0时,要找节点为1的儿子,会让异或更大。

所以贪心求解。

代码如下。

#include
#include
#define rr register#define sc(x) scanf("%d",&x) using namespace std;const int maxn=100001;int n;int head[maxn],tot;struct node{ int nxt,to,val; #define to(x) e[x].to #define val(x) e[x].val #define nxt(x) e[x].nxt}e[maxn<<1];inline void add(int u,int v,int w){ to(++tot)=v,val(tot)=w; nxt(tot)=head[u]; head[u]=tot; }int xorr[maxn];//所有点到根节点的异或值inline void dfs(int now,int ls){ for(rr int i=head[now];i;i=nxt(i)){ if(to(i)!=ls){ xorr[to(i)]=xorr[now]^val(i); dfs(to(i),now); } }}int cnt,trie[maxn*31][2];inline void build(int x,int p){ for(rr int i=1<<30;i;i>>=1){ bool c=x&i; if(!trie[p][c]) trie[p][c]=++cnt; p=trie[p][c]; }}inline int ask(int x,int p){ int ans=0; for(rr int i=1<<30;i;i>>=1){ bool c=x&i; if(trie[p][c^1]) ans+=i,p=trie[p][c^1]; else p=trie[p][c]; } return ans;}int main(){ sc(n); for(rr int i=1;i

 

转载于:https://www.cnblogs.com/ChrisKKK/p/11143990.html

你可能感兴趣的文章
Kettle数据源连接配置
查看>>
[na]pc加入域认证细节
查看>>
网络爬虫基本原理(一)
查看>>
python学习Day6 元组、字典、集合set三类数据用法、深浅拷贝
查看>>
Quartz.NET实现作业调度
查看>>
[转]abstract 抽象类的概念和使用
查看>>
JAX-WS发布WebService
查看>>
ES6 块级作用域
查看>>
Node.js笔记(0003)---Express框架Router模块学习笔记
查看>>
ActiveMQ demo
查看>>
批处理计算n天前\后的日期
查看>>
POJ 1703 Find them, Catch them
查看>>
git配置的位置
查看>>
struts2学到屎挫死-深入Struts2(2)--Action
查看>>
objc 笔记
查看>>
JavaScript高级程序设计学习笔记--BOM
查看>>
鉴客 C# 抓取页面(带认证)
查看>>
xcode 调试提示
查看>>
Javascript的块级作用域
查看>>
SQL Server系统表sysobjects介绍
查看>>