首页 > 其他分享 >P4551 最长异或路径

P4551 最长异或路径

时间:2022-08-30 16:25:57浏览次数:68  
标签:int ll 路径 nd P4551 trie 异或 num

给定树上 \(n\) 个点和边权,求两点间所有边权的异或和最大。 \(n\leq 10^5\) 。


首先如果假定一个根,那么所有点到根的距离 \(dis[i]\) 中两两异或得到的就是答案。( \(x,y\) 两点的距离= \(dis[x]\,\,xor\,\,dis[y]\) ,从lca到根的距离会因为异或2次而被消掉)。那么用 \(Trie\) 树来维护前面的 \(dis[i]\) ,在查询之后将其加入即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
namespace Trie{
	int trie[60000000][2],tcnt=1;
	inline void insert(ll num){
		ll p=1;
		for(int i=30;i>=0;--i){
			if(trie[p][(num>>i)&1]){
				p=trie[p][(num>>i)&1];
			}
			else{
				trie[p][(num>>i)&1]=++tcnt;
				p=tcnt;
			}
		}
	}
	inline ll find(ll num){
		ll p=1,ret=0;
		for(int i=30;i>=0;--i){
			if(trie[p][((num>>i)&1)^1]){
				p=trie[p][((num>>i)&1)^1];
				ret+=1<<i;
			}
			else{
				p=trie[p][(num>>i)&1];
			}
		}
		return ret;
	}
}
using namespace Trie;

ll head[100005],ecnt=1,val[100005];
struct node{
	ll nxt,to,w;
}nd[1000005];

inline void adde(int u,int v,ll w){
	nd[++ecnt].nxt=head[u];
	nd[ecnt].to=v;
	nd[ecnt].w=w;
	head[u]=ecnt;
}
ll n,ans;

void dfs(int x,int fa){
	for(int i=head[x];i;i=nd[i].nxt){
		if(nd[i].to==fa)
			continue;
		val[nd[i].to]=val[x]^nd[i].w;
		dfs(nd[i].to,x);
	}
}


int main(){
	scanf("%lld",&n);
	for(int i=1;i<n;++i){
		int u,v,w;
		scanf("%d %d %d",&u,&v,&w);
		adde(u,v,w);
		adde(v,u,w);
	}
	dfs(1,1);
	for(int i=1;i<=n;++i){
		ans=max(ans,find(val[i]));
		insert(val[i]);
	}
	printf("%lld",ans);
	return 0;
}

标签:int,ll,路径,nd,P4551,trie,异或,num
From: https://www.cnblogs.com/zhouzizhe/p/16639808.html

相关文章

  • P4735 最大异或和
    给定一个非负整数序列\(\{a\}\),初始长度为\(n\)。有\(m\)个操作,有以下两种操作类型:Ax:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(n+1\)。Qlrx:询问操......
  • P4592 [TJOI2018]异或
    有一颗以\(1\)为根节点的由\(n\)个节点组成的树,节点从\(1\)至\(n\)编号。树上每个节点上都有一个权值\(v_i\)。现在有\(q\)次操作,操作如下:\(1~x~z\):查询节点......
  • 71. 简化路径
    71.简化路径#核心思想:栈#依据题意..不需要出栈,其余入栈classSolution:defsimplifyPath(self,path:str)->str:stack=[]forpinpat......
  • 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止......
  • python-获取目录内所有文件的绝对路径,获取文件大小并输出到txt文件中
     代码如下:importosdirpath='D:\\'t=[]forroot,dirs,filesinos.walk(dirpath):forfileinfiles:temp=os.path.join(root,file).repl......
  • 在基环树上 判断一个点到另外一个点的路径是不是大于2
    树:n点n-1边基环树:n点n以上边#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5,M=N*2;intn,q;inth[N],e[M],ne[M],idx;intfa[N],d......
  • cmake find_package路径详解
    Motivation经常在Linux下面写C++程序,尤其是需要集成各种第三方库的工程,肯定对find_package指令不陌生。这是条很强大的指令。可以直接帮我们解决整个工程的依赖问题,自动......
  • realpath函数,返回规范化的绝对路径名
    PHP中的realpath()函数是一个内置函数,用于返回规范化的绝对​​路径名。小编主要用于linux与window下路径问题的处理.之前小编本地的w11,程序运行的好好的.上传到服务器上......
  • LeetCode — 最小路径和
    LeetCode—最小路径和问题陈述给定一个mxn网格用非负数填充,找到一条从左上角到右下角的路径,该路径最小化沿其路径的所有数字的总和。笔记:您只能在任何时间点向下或......
  • 部署web服务器时虚拟路径的问题-什么是虚拟路径?有什么用?
    https://blog.csdn.net/sunjintaoxxx/article/details/119778776https://zhidao.baidu.com/question/11331085.html 当使用Dreamweaver将文件上传到远程服务器后,这些......