【POJ 3764】The Xor-longest Path
题目
给定一个\(n\)个点的带权无根树,求树上异或和最大的一条路径。
\(n\le 10^5\)
分析
一个简单的例子
相信大家都做过这题:
给定一个\(n\)个点的带权无根树,有\(m\)个询问,要求树上两点之间的权值异或和。
\(n,m\le 10^7\)
Xor运算有一些很显然的性质:
\(a \oplus a = 0\)
\(a \oplus b = b \oplus a\)
\(a\oplus b\oplus c = a\oplus(b\oplus c)\)
对于这道水题,我们只需要随便取一个点作为根节点,预处理节点\(i\)到根节点的路径异或和\(dist[i]\),然后\(a,b\)的路径的异或和即为\(dist[a]\oplus dist[b]\oplus dist[LCA(a,b)]\oplus dist[LCA(a,b)]=dist[a]\oplus dist[b]\)
回到本题
回到我们这题,我们只需要随便取一个点作为根节点,利用dfs处理出每个点到根节点的路径异或和,求这些异或和的最大异或即可,因为它们的LCA到根节点的路径被抵消了。
利用Trie实现求最大异或和。
代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct edge {
	int to, nxt, val;
} edges[MAXN << 1];
int head[MAXN], path[MAXN], trie[MAXN << 5][2], num = 2, tot = 0, cnt = 0, n;
bool vis[MAXN];
void addedge(int from, int to, int val) {
	edges[cnt].to = to, edges[cnt].val = val, edges[cnt].nxt = head[from];
	head[from] = cnt++;
}
void dfs(int x, int w) {
	vis[x] = 1;
	path[tot++] = w;
	for(int i = head[x]; i != -1; i = edges[i].nxt) {
		if(!vis[edges[i].to]) {
			dfs(edges[i].to, w ^ edges[i].val);
		}
	}
}
void insert(int x) {
	int cur = 1;
	for(int i = 30; i >= 0; i--) {
		int p = (x >> i) & 1;
		if(trie[cur][p]) cur = trie[cur][p];
		else cur = trie[cur][p] = num++;
	}
}
int getmaxxor(int x) {
	int cur = 1, ans = 0;
	for(int i = 30; i >= 0; i--) {
		int p = ((x >> i) & 1) ^ 1;
		if(trie[cur][p]) {
			cur = trie[cur][p];
			ans = ans << 1 | 1;
		} else {
			cur = trie[cur][p ^ 1];
			ans <<= 1;
		}
	}
	return ans;
}
int main() {
	ios::sync_with_stdio(false);
	memset(head, 0xff, sizeof(head));
	int u, v, w;
	cin >> n;
	for(int i = 0; i < n - 1; i++) {
		cin >> u >> v >> w;
		addedge(u, v, w);
		addedge(v, u, w);
	}
	dfs(1, 0);
	int ans = 0;
	for(int i = 0; i < n; i++) insert(path[i]);
	for(int i = 0; i < n; i++) ans = max(ans, getmaxxor(path[i]));
	cout << ans << endl;
	return 0;
}
												
											【POJ 3764】The Xor-longest Path的更多相关文章
- 【POJ 3764】 The xor-longest path
		
[题目链接] http://poj.org/problem?id=3764 [算法] 首先,我们用Si表示从节点i到根的路径边权异或和 那么,根据异或的性质,我们知道节点u和节点v路径上的边权异或和就 ...
 - bzoj 2295: 【POJ Challenge】我爱你啊
		
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
 - 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
		
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
 - BZOJ2288: 【POJ Challenge】生日礼物
		
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
 - BZOJ2293: 【POJ Challenge】吉他英雄
		
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
 - BZOJ2287: 【POJ Challenge】消失之物
		
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
 - BZOJ2295: 【POJ Challenge】我爱你啊
		
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
 - BZOJ2296: 【POJ Challenge】随机种子
		
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
 - BZOJ2292: 【POJ Challenge 】永远挑战
		
2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 513 Solved: 201[Submit][ ...
 
随机推荐
- iOS - 毛玻璃动画效果
			
声明全局变量 #define kMainBoundsHeight ([UIScreen mainScreen].bounds).size.height //屏幕的高度 #define kMainBou ...
 - 本人常用的Phpstorm快捷键
			
我设置的是eclipse的按键风格(按键习惯),不是phpstorm的风格 1.添加TODO(这个不是快捷键)://TODO 后面是说明,换行写实现代码 2.选择相同单词做一次性修改:Alt+J+鼠标 ...
 - vue中使用setTimeout
			
在vue的函数中使用setTimeout self.distroyTimeout = setTimeout(()=>{ self.initData() },1000) 这时清除setTimeou ...
 - JavaScript模块化开发的那些事
			
模块化开发在编程开发中是一个非常重要的概念,一个优秀的模块化项目的后期维护成本可以大大降低.本文主要介绍了JavaScript模块化开发的那些事,文中通过一个小故事比较直观地阐述了模块化开发的过程. ...
 - python_35_进度条
			
import sys for i in range(50): sys.stdout.write("+")#此命令不会像print语句执行一次,换行一次\ sys.stdout.fl ...
 - 踩坑日志!viser-ng的使用
			
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
 - python linecache模块读取文件用法详解
			
linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. linecache.getlines(filename) 从名为filename的文件中得到 ...
 - RPC - 麻雀虽小,五脏俱全
			
说起 RPC (远程过程调用),大家应该不陌生.随着微服务.分布式越来越流行,RPC 应用越来越普遍.常见的 RPC 框架如:Dubbo.gRPC.Thrift 等.本篇文章不是介绍各种 RPC 的使 ...
 - SSH实验
			
跳板机实验1:本地转发 实验环境: 三台主机:A,B,C 目标A与C通过telnet连接 A主机和B,C主机之间有防火墙相隔,A与B之间可以通过SSH协议连接,BC之间可以通过telnet协议连接 环 ...
 - Apache 错误日志
			
配置文件中:httpd.conf ErrorLog "/usr/local/var/log/apache2/error_log1" CustomLog "/usr/loc ...