「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
输入格式
第一行一个整数 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≤105,1≤u,v≤n,0≤w<231
题解
首先对于树上两点路径的异或值,可以用一个树上前缀和维护。
记$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的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- LOJ#10117. 「一本通 4.1 练习 2」简单题
LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map
题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...
- 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP
题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...
- 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集
题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
- 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)
[LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...
随机推荐
- Linux学习日志--共享内存
一:什么是共享内存 共享内存是属于IPC(Inter-Process Communication进程间通信)机制,其它两种是信号量和消息队列,该机制为进程开辟创建了特殊的地址范 ...
- gulp 静态资源版本控制
package.json { "name": "gulp", "version": "0.0.1", "des ...
- wifi认证Portal开发系列(三):portal协议
中国移动WLAN业务PORTAL协议规范介绍 一.用户上线认证流程 上线流程完成用户账号的认证,并把认证结果通知Portal Server,Portal server将会通知WLAN用户并且显示相应的 ...
- linux启动参数了解
文章来源:http://blog.csdn.net/uyiwfn/article/details/7172339在Linux中,给kernel传递参数以控制其行为总共有三种方法:1.build ker ...
- Erlang 在erlang项目中使用protobuf
protobuf是google的一个序列化框架,类似XML,JSON,其特点是基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,广泛用于服务端与客户端通信.文章将着重介绍在erl ...
- 利用Docker Compose快速搭建本地测试环境
前言 Compose是一个定义和运行多个Docker应用的工具,用一个YAML(dockder-compose.yml)文件就能配置我们的应用.然后用一个简单命令就能启动所有的服务.Compose编排 ...
- Altera Quartus 13.1 仿真工具路径错误问题解决 Can't launch the ModelSim-Altera software
Altera Quartus 13.1 仿真工具路径错误问题解决 Quartus13.1 自带的ModelSim-Altera 10.1d 版本, 在做仿真时调用 ModelSim-Alteara,发 ...
- 九度OJ 1039:Zero-complexity Transposition(逆置) (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3093 解决:1255 题目描述: You are given a sequence of integer numbers. Zero-co ...
- Ceph集群rbd-mirror A、B区域备份实施方案
Ceph集群rbd-mirror A.B区域备份实施方案 备注:首先准备两个集群, 并确认其状态,集群的准备过程在这就不做陈述 1.查看集群状态 A区域 [root@ceph2111 ceph]# c ...
- SIFT算法详解(转)
原文地址 http://blog.csdn.net/pi9nc/article/details/23302075 尺度不变特征变换匹配算法详解 Scale Invariant Feature Tran ...