#10056. 「一本通 2.3 练习 5」The XOR-longest Path

题目描述

原题来自:POJ 3764

给定一棵 nnn 个点的带权树,求树上最长的异或和路径。

输入格式

第一行一个整数 nnn,接下来 n−1n-1n−1 行每行三个整数 u,v,wu,v,wu,v,w,表示 u,vu,vu,v 之间有一条长度为 www 的边。

输出格式

输出一行一个整数,表示答案。

样例

样例输入

4
1 2 3
2 3 4
2 4 6

样例输出

7

样例解释

最长的异或和路径是 1→2→31\to 2\to 31→2→3 ,它的长度是 3⨁4=73 \bigoplus 4=73⨁4=7。

注意:结点下标从 111 开始到 NNN。

注:x⨁yx \bigoplus yx⨁y 表示 xxx 与 yyy 按位异或。

数据范围与提示

对于 100%100\%100% 的数据,1≤n≤105,1≤u,v≤n,0≤w<2311\le n\le 10^5,1\le u, v \le n,0 \le w < 2^{31}1≤n≤10​5​​,1≤u,v≤n,0≤w<2​31​​

题解

首先对于树上两点路径的异或值,可以用一个树上前缀和维护。

记$sum[x]$为$x$到祖先的异或和。

由于异或有:$a ⨁ a = 0$

所以如下图,在$sum[u] ⨁ sum[v]$时,lca以上的屎色线已经被消掉了。

所以$ans=sum[u] ⨁ sum[v]$

问题转化为:有1e5个数,要求其中两数异或的最大值。

于是变为「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

于是这道题就可以由两道看起来离得很远的题拼起来而成了。

 编号     题目     状态     分数     总时间     内存     代码 / 答案文件     提交者     提交时间
# #. 「一本通 2.3 练习 」The XOR-longest Path Accepted ms KiB C++ / 1.8 K qwerta -- :: #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
inline int read()
{
char ch=getchar();
int x=;
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x;
}
const int MAXN=1e5+;
struct emm{
int e,f,v;
}a[*MAXN];//用来建树
int h[MAXN];
int tot=;
void con(int x,int y,int l)//连树边
{
a[++tot].f=h[x];
h[x]=tot;
a[tot].e=y;
a[tot].v=l;
a[++tot].f=h[y];
h[y]=tot;
a[tot].e=x;
a[tot].v=l;
return;
}
int d[MAXN],w[MAXN];//记深度和前缀和
void dfs(int x)//dfs遍历树
{
for(int i=h[x];i;i=a[i].f)
if(!d[a[i].e])
{
w[a[i].e]=(w[x] xor a[i].v);
d[a[i].e]=d[x]+;
dfs(a[i].e);
}
return;
}
struct ahh{
int nxt[];
}tr[];//Trie树
int cnt=;
int b[];//用来按位拆分
void add(int x)
{
int j=-;
memset(b,,sizeof(b));
while(x)//拆二进制
{
b[++j]=x&;
x>>=;
}
int k=;
for(int j=;j>=;--j)
{
if(!tr[k].nxt[b[j]])
tr[k].nxt[b[j]]=++cnt;
k=tr[k].nxt[b[j]];
}
return;
}
long long find(int x)//返回与x异或的最大结果
{
int j=-;
memset(b,,sizeof(b));
while(x)
{
b[++j]=x&;
x>>=;
}
long long now=;
int k=;
for(int j=;j>=;--j)
{
if(tr[k].nxt[-b[j]])//尽量往不一样的走
{
now+=(<<j);
k=tr[k].nxt[-b[j]];
}
else k=tr[k].nxt[b[j]];
}
return now;
}
int main()
{
//freopen("a.in","r",stdin);
int n=read();
for(int i=;i<n;++i)
{
int u=read(),v=read(),w=read();
con(u,v,w);//连树边
}
int s=min(,n);
d[s]=;
dfs(s);
long long ans=;
for(int i=;i<=n;++i)
add(w[i]);//加前缀和
for(int i=;i<=n;++i)
ans=max(ans,find(w[i]));//记录答案
cout<<ans;
return ;
}

「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  5. 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map

    题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...

  6. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  7. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...

  8. #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ

    题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...

  9. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

随机推荐

  1. java Map 实现类的对比

    java为数据结构中的映射定义了一个接口 java.util.Map ,他有四个实现类

  2. Spring中的scope配置和@scope注解

    Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围.在 Spring IoC 容器中具有以下几种作用域:基本作用域(single ...

  3. LinkedList 基本示例及源码解析

    目录 一.JavaDoc 简介 二.LinkedList 继承接口和实现类介绍 三.LinkedList 基本方法介绍 四.LinkedList 基本方法使用 五.LinkedList 内部结构以及基 ...

  4. JavaScript之this的工作原理

    JavaScript 有一套完全不同于其它语言的对 this 的处理机制. 在五种不同的情况下 ,this 指向的各不相同. 1.全局范围内 当在全部范围内使用 this,它将会指向全局对象. 2.函 ...

  5. 【BZOJ4052】[Cerc2013]Magical GCD 乱搞

    [BZOJ4052][Cerc2013]Magical GCD Description 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12.  求一个连续子序列,使得在所有的连续 ...

  6. sql server charindex函数和patindex函数详解(转)

    charindex和patindex函数常常用来在一段字符中搜索字符或字符串.假如被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数. ...

  7. MySql 三大知识点——索引、锁、事务(转)

    1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. 索引的优点:1. 天生排序.2. 快速查找.索引的缺点:1. 占用空间.2. 降低更新表的速度. 注意点:小表使用全表扫描 ...

  8. php中$t=date()函数参数意义及时间更改

    php中date()函数用的最多的是:date('Y-m-d H:i:s', time());  这里面的参数意义分别是:Y - 年,四位数字; 如: "2016":m - 月份, ...

  9. 【题解】[CF718C Sasha and Array]

    [题解]CF718C Sasha and Array 对于我这种喜欢写结构体封装起来的选手这道题真是太对胃了\(hhh\) 一句话题解:直接开一颗线段树的矩阵然后暴力维护还要卡卡常数 我们来把\(2 ...

  10. Flask:模板

    模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,具体值只在请求的上下文中才能知道.使用真实值替换变量,再返回最终得到的响应字符串.这个过程称为渲染,为了渲染模板,Flask使用了一个名 ...