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

2023-10-14 09:40

本文主要是介绍「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

题目描述

原题来自:POJ 3764

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

输入格式

第一行一个整数 nnn,接下来 n−1n-1n1 行每行三个整数 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 3123 ,它的长度是 3⨁4=73 \bigoplus 4=734=7。

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

注:x⨁yx \bigoplus yxy 表示 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}1n105​​,1u,vn,0w<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

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

  1 编号     题目     状态     分数     总时间     内存     代码 / 答案文件     提交者     提交时间
  2 #231397     #10056. 「一本通 2.3 练习 5」The XOR-longest Path    Accepted     100     225 ms     10364 KiB     C++ / 1.8 K     qwerta     2018-10-16 16:53:15
  3 
  4 #include<iostream>
  5 #include<cstring>
  6 #include<cstdio>
  7 #include<cmath>
  8 using namespace std;
  9 inline int read()
 10 {
 11     char ch=getchar();
 12     int x=0;
 13     while(!isdigit(ch))ch=getchar();
 14     while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
 15     return x;
 16 }
 17 const int MAXN=1e5+3;
 18 struct emm{
 19     int e,f,v;
 20 }a[2*MAXN];//用来建树
 21 int h[MAXN];
 22 int tot=0;
 23 void con(int x,int y,int l)//连树边
 24 {
 25     a[++tot].f=h[x];
 26     h[x]=tot;
 27     a[tot].e=y;
 28     a[tot].v=l;
 29     a[++tot].f=h[y];
 30     h[y]=tot;
 31     a[tot].e=x;
 32     a[tot].v=l;
 33     return;
 34 }
 35 int d[MAXN],w[MAXN];//记深度和前缀和
 36 void dfs(int x)//dfs遍历树
 37 {
 38     for(int i=h[x];i;i=a[i].f)
 39     if(!d[a[i].e])
 40     {
 41         w[a[i].e]=(w[x] xor a[i].v);
 42         d[a[i].e]=d[x]+1;
 43         dfs(a[i].e);
 44     }
 45     return;
 46 }
 47 struct ahh{
 48     int nxt[2];
 49 }tr[3200003];//Trie树
 50 int cnt=0;
 51 int b[33];//用来按位拆分
 52 void add(int x)
 53 {
 54     int j=-1;
 55     memset(b,0,sizeof(b));
 56     while(x)//拆二进制
 57     {
 58         b[++j]=x&1;
 59         x>>=1;
 60     }
 61     int k=0;
 62     for(int j=31;j>=0;--j)
 63     {
 64         if(!tr[k].nxt[b[j]])
 65           tr[k].nxt[b[j]]=++cnt;
 66         k=tr[k].nxt[b[j]];
 67     }
 68     return;
 69 }
 70 long long find(int x)//返回与x异或的最大结果
 71 {
 72     int j=-1;
 73     memset(b,0,sizeof(b));
 74     while(x)
 75     {
 76         b[++j]=x&1;
 77         x>>=1;
 78     }
 79     long long now=0;
 80     int k=0;
 81     for(int j=31;j>=0;--j)
 82     {
 83         if(tr[k].nxt[1-b[j]])//尽量往不一样的走
 84         {
 85             now+=(1<<j);
 86             k=tr[k].nxt[1-b[j]];
 87         }
 88         else k=tr[k].nxt[b[j]];
 89     }
 90     return now;
 91 }
 92 int main()
 93 {
 94     //freopen("a.in","r",stdin);
 95     int n=read();
 96     for(int i=1;i<n;++i)
 97     {
 98         int u=read(),v=read(),w=read();
 99         con(u,v,w);//连树边
100     }
101     int s=min(7,n);
102     d[s]=1;
103     dfs(s);
104     long long ans=0;
105     for(int i=1;i<=n;++i)
106       add(w[i]);//加前缀和
107     for(int i=1;i<=n;++i)
108       ans=max(ans,find(w[i]));//记录答案
109     cout<<ans;
110     return 0;
111 }

 

转载于:https://www.cnblogs.com/qwerta/p/9822673.html

这篇关于「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209684

相关文章

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

2.3多任务编程示例1

1.CUBEMAX配置  2.CODE void StartTask1(void const * argument){/* USER CODE BEGIN StartTask1 */TickType_t pxPreviousWakeTime=xTaskGetTickCount();/* Infinite loop */for(;;){LED1_Turn();// vTaskDelay

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

anaconda3下的python编程练习-csv翻译器

相关理解和命令 一、环境配置1、conda命令2、pip命令3、python命令 二、开发思路三、开发步骤 一、环境配置 1、conda命令 镜像源配置 conda config --show channels //查看镜像源conda config --remove-key channels //删除添加源,恢复默认源#添加镜像源conda config --ad

推荐练习键盘盲打的网站

对于初学者来说,以下是一些推荐的在线打字练习网站: 打字侠:这是一个专业的在线打字练习平台,提供科学合理的课程设置和个性化学习计划,适合各个水平的用户。它还提供实时反馈和数据分析,帮助你提升打字速度和准确度。 dazidazi.com:这个网站提供了基础的打字练习,适合初学者从零开始学习打字。 Type.fun打字星球:提供了丰富的盲打课程和科学的打字课程设计,还有诗词歌赋、经典名著等多样

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述:企业内网和运营商网络如上图所示。 公网IP段:12.1.1.0/24。 内网IP段:192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证,用户名:admin 密码:Admin@123 财务PC 配置静态IP:192.168.1.8 R1使用模拟器中的AR201型号,作为交换路由一体机,下图的WAN口为E0/0/8口,可以在该接口下配置IP地址。 可以通过