HRBUST 2072 树上求最大异或路径值
一个很经典的套路 思想是 F [u,v] = F[1,u] ^ F[1,v]
这样就转化成了n个数两两异或 求最大值 可以用字典树来做 每次用当前数去树中寻求最大xor值 然后把这个数字插进去 就相当于这个数字和之前所有的数字都比较了
发现自从学习了kdtree等一群数据结构之后...写什么都想学线段树的写法..好像很不错啊..?
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;
#define L long long
#define pb push_back const L maxn = 100050 ; L n ;
vector<L >q[maxn] ;
vector<L >w[maxn] ;
L f[maxn] ;
bool vis[maxn] ; void bfs(L u) {
queue<L > que ;
que.push(u) ;
que.push(0) ;
while(!que.empty()) {
L u = que.front() ; que.pop() ;
L ff = que.front() ; que.pop() ;
for(L i = 0 ; i < q[u].size() ; i ++ ){
L v = q[u][i] ;
if(vis[v]) {
vis[v] = false ;
f[v] = ff ^ w[u][i] ;
que.push(v) ;
que.push(f[v]) ;
}
}
}
} L a[50] ;
struct node {
L l , y ;
}b[35 * maxn];
L cnt ;
L e[50] ; L did() {
L qs = 0 ;
L de = 0 ;
L res = 0;
while(de + 1 <= 32) {
L nd = de + 1 ;
if(a[nd] == 1) {
if(b[qs].l != -1) {
res += e[nd] ;
qs = b[qs].l ;
}
else if(b[qs].y != -1) {
res += 0 ;
qs = b[qs].y ;
}
else return res ;
}
else {
if(b[qs].y != -1) {
res += e[nd] ;
qs = b[qs].y ;
}
else if(b[qs].l != -1) {
res += 0 ;
qs = b[qs].l ;
}
else return res ;
}
de = nd ;
}
return res ;
} void inse() {
L qs = 0 ;
L de = 0 ;
while(de + 1 <= 32) {
L nd = de + 1 ;
if(a[nd] == 0) {
if(b[qs].l == -1) {
b[qs].l = (++cnt) ;
qs = b[qs].l;
b[qs].l = -1 ;
b[qs].y = -1 ;
}
else {
qs = b[qs].l ;
}
}
else {
if(b[qs].y == -1) {
b[qs].y = (++cnt) ;
qs = b[qs].y;
b[qs].l = -1 ;
b[qs].y = -1 ;
}
else {
qs = b[qs].y ;
}
}
de = nd ;
}
} int main(){
while(scanf("%lld",&n) != EOF) {
for(L i = 1 ; i <= n ; i ++ )q[i].clear() ;
for(L i = 1 ; i <= n ; i ++ )w[i].clear() ;
for(L i = 1 ; i < n ; i ++ ){
L u , v , c;
scanf("%lld%lld%lld",&u,&v,&c) ;
q[u].pb(v);
q[v].pb(u);
w[u].pb(c);
w[v].pb(c);
}
e[32] = 1 ;
for(L j = 31 ; j >= 1 ; j -- ) {
e[j] = 2*e[j+1] ;
}
memset(vis,true,sizeof(vis));
f[1] = 0 ;
vis[1] = false;
bfs(1) ;
cnt = 0 ;
b[cnt].l = -1;
b[cnt].y = -1;
L ans = 0 ;
for(L i = 1 ; i <= n ; i ++ ){
L x = f[i];
for(L j = 32 ; j >= 1 ; j -- ) {
a[j] = x%2 ;
x /= 2 ;
}
L res = did() ;
if(ans < res) ans = res ;
inse() ;
}
printf("%lld\n",ans) ;
}
}
// 好像还是第一次写字典树 ..
HRBUST 2072 树上求最大异或路径值的更多相关文章
- 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...
- P4551 最长异或路径
题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- P4551 最长异或路径 (01字典树,异或前缀和)
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...
- [luogu] P4551 最长异或路径(贪心)
P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...
- Luogu P4551 最长异或路径
题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...
- [POJ3764]最长异或路径
Description: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. Hint: \(n<=10^5\) Solution: 真是01Trie傻逼题,居 ...
- [luogu4551][POJ3764]最长异或路径
题目描述 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 分析 处理出各个节点到根节点的异或距离,然后我 ...
- 01Trie【p4551(poj3764)】 最长异或路径
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(T ...
随机推荐
- JS中的动态合集与静态合集
JS的动态合集 前言 DOM是JavaScript重要组成部分,在DOM中有三个特别的集合分别是NodeList(节点的集合),NamedNodeMap(元素属性的集合)和HTMLCollection ...
- Xamarin.Forms学习之XAML命名空间
大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...
- bootstrap页面布局
首先,我们必须明确,在这四种角色登录网站,看到页面是不同,这里不仅涉及到后端的权限控制,还涉及到前端页面的布局,区分好这些角色看的东西哪些是相同的,哪些又是不同的呢,这个必须在这里想明白,所以要做好页 ...
- MySql 的备份与恢复
1. 数据库导出 SQL 脚本 mysqldump -u 用户名 -p 密码 数据库名称>生成的脚本文件路径 示例: mysqldump -uroot -p 123 mydb1>/User ...
- linux下tcpdump命令的使用
一般情况下linux系统会自带tcpdump工具,如果系统没有安装,直接用命令安装就行了. 安装命令:yum install -y tcpdump 查看安装版本命令:tcpdump --help 查看 ...
- django startapp报 maximum recursion depth exceeded
报错截图如下: 解决办法:修改指定路径下的functools.py文件的def total_ordering(cls):方法: 原来的样子: convert = { '__lt__': [('__gt ...
- 正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询
查看表相关命令 - 查看表结构 desc 表名- 查看生成表的SQL show create table 表名- 查看索引 show index from 表名 使用索引和不使用索引 由 ...
- (转)fiddler使用简介--其一
原文地址:https://www.cnblogs.com/miantest/p/7289694.html Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行 ...
- Bootstrap主题库
主题 https://startbootstrap.com/template-categories/all/ https://bootstrapmade.com/ http://www.jqueryf ...
- python tkinter组件学习
http://blog.csdn.net/pfm685757/article/details/50162567