最长异或路径 ---- (字典树求异或最大)

目录

最长异或路径:

题目大意:

思路解析:

代码实现:


最长异或路径:

题目大意:

思路解析:

现在假设有一棵这样的树,我们并不关心每条边的路径权值为多少,假设划红线的地方是异或值最大的一条路径,那我们可以发现我们只需要知道1-11的异或值,1-7路径的异或值,那我们在贪心的过程一定能得到最优答案

 

第二种情况,最大异或路径不经过顶点,但是我们发现 11 ^ 5 ^ 6 ^ 13 ^ 14等价于(2 ^ 5 ^ 11) ^ (  2 ^ 6 ^ 13 ^ 14) ,可以发现还是相当于1--11的路径异或1-14的路径,所以我们只需要得到顶点到其他任意结点的路径即可,那我们在贪心选择时一定能得到最优解。

 

 

现在得到顶点到其他任意结点的异或路径值后,我们应该考虑我们如何贪心的选择。

假设我们现在路径的异或值为 2,曾经到过的路径异或值有(5 ,4,3,6)他们的二进制数分布为010,101,100,011,110,我们发现我们与5的路径异或后能得到最优答案。那么贪心选择为从二进制位的高位开始抉择,如果能有一个数能和当前值异或后在该位为1就选择这个数。

但是如果我们进行遍历选择,就会时间复杂度过高,那我们可以使用01字典树,这样就可以每次筛去大部分结果。

代码实现:

import java.io.*;
import java.util.*;import static java.lang.String.*;public class Main {static int MAXN = 100010;static int n;static int[][] tree = new int[MAXN << 3][2];static int[] nxt = new int[MAXN << 1];static int[] head = new int[MAXN];static int[] to = new int[MAXN << 1];static int[] weight = new int[MAXN << 1];static int tot = 0;static int ans = 0;static int cnt;static int[] dp = new int[MAXN];public static void main(String[] args) throws IOException {FastScanner f = new FastScanner();PrintWriter w = new PrintWriter(System.out);n = f.nextInt();for (int i = 0; i < n - 1; i++) {int x = f.nextInt();int y = f.nextInt();int v = f.nextInt();add(x, y, v);add(y,x,v);}dfs(1, 0);w.println(ans);w.flush();w.close();}static void dfs(int x, int fa){insert(dp[x]);get(dp[x]);for (int i = head[x]; i != 0; i = nxt[i]) {int y = to[i];if (y == fa) continue;dp[y] = dp[x] ^ weight[i];dfs(y, x);}}static void insert(int x){int p = 0;for(int i = 30; i >= 0; i--){int c = ((x >> i) & 1);if (tree[p][c] == 0){tree[p][c] = ++cnt;}p = tree[p][c];}}static void get(int x){int res = 0;int p = 0;for (int i = 30; i >= 0; i--) {int c = ((x >> i) & 1);if (tree[p][c ^ 1] != 0){res |= (1 << i);p = tree[p][c ^ 1];}else {p = tree[p][c];}}ans = Math.max(ans, res);}static void add(int x, int y, int v){nxt[++tot] = head[x];head[x] = tot;to[tot] = y;weight[tot] = v;}private static class FastScanner {final private int BUFFER_SIZE = 1 << 16;private DataInputStream din;private byte[] buffer;private int bufferPointer, bytesRead;private FastScanner() throws IOException {din = new DataInputStream(System.in);buffer = new byte[BUFFER_SIZE];bufferPointer = bytesRead = 0;}private short nextShort() throws IOException {short ret = 0;byte c = read();while (c <= ' ') c = read();boolean neg = (c == '-');if (neg) c = read();do ret = (short) (ret * 10 + c - '0');while ((c = read()) >= '0' && c <= '9');if (neg) return (short) -ret;return ret;}private int nextInt() throws IOException {int ret = 0;byte c = read();while (c <= ' ') c = read();boolean neg = (c == '-');if (neg) c = read();do ret = ret * 10 + c - '0';while ((c = read()) >= '0' && c <= '9');if (neg) return -ret;return ret;}public long nextLong() throws IOException {long ret = 0;byte c = read();while (c <= ' ') c = read();boolean neg = (c == '-');if (neg) c = read();do ret = ret * 10 + c - '0';while ((c = read()) >= '0' && c <= '9');if (neg) return -ret;return ret;}private char nextChar() throws IOException {byte c = read();while (c <= ' ') c = read();return (char) c;}private String nextString() throws IOException {StringBuilder ret = new StringBuilder();byte c = read();while (c <= ' ') c = read();do {ret.append((char) c);} while ((c = read()) > ' ');return ret.toString();}private void fillBuffer() throws IOException {bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);if (bytesRead == -1) buffer[0] = -1;}private byte read() throws IOException {if (bufferPointer == bytesRead) fillBuffer();return buffer[bufferPointer++];}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPS/Office 好用的Word插件-查找替换

例如&#xff1a;一片文档&#xff1a;…………泰山…………泰&#xff08;少打了山字&#xff09;………… 要是把“泰”查找替换为“泰山”&#xff0c;就会把前面的“泰山”变成“泰山山”&#xff0c;这种问题除了再把“泰山山”查找替换为“泰山”&#xff0c;有没有更简单…

吴恩达deeplearning.ai:机器学习项目的完整周期伦理

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 语音识别部署公平、偏见、伦理 这节博客中&#xff0c;我们主要看看构建一个机器学习的完整周期是什么&#xff0c;也就是说&#xff0c;当你想构建一个有价值的机器学习系统时&am…

Freecad Assembly4装配模型设计入门

一、基本信息 本文内容&#xff1a;学习Assembly4装配模型设计功能。 2024年3月7日 最新版Freecad 0.21.2 最新版 Assembly4 0.50.8 下载地址&#xff1a;stoneold/FreeCAD_Assembly4 最新版 Assembly4 示例教程 下载地址&#xff1a;FreeCAD_Examples: Freecad Assmbly4 …

菜品上架与展示

菜品上架与展示 1、功能简介 1、实现菜品的上架 2、实现菜品的展示 2、代码展示 2.1 food类 package com.ham.pkg.ArryList;public class Food {private String name;private double price;private String desc;public Food(String name, double price, String desc) {this.…

CubeMX使用教程(3)——GPIO

在第二章我们完成了点灯仪式&#xff0c;这次我准备尝试把按键和灯结合起来&#xff0c;做一次GPIO的综合测试 实验任务为&#xff1a;按下按键1&#xff08;B1&#xff09;&#xff0c;第1个灯&#xff08;LD1&#xff09;亮&#xff1b; 按下按键2&#xff08;B2&#xff09;…

Vue3.0 vue.js.devtools无法显示Pinia调试工具

之前的配置方式&#xff1a; app.use(createPinia()) app.mount(#app) 更新配置方式&#xff1a; app.use(createPinia()).mount("#app") 设置之后即可显示调试工具

25考研资料PDF汇总

资料V馊public号ZL研知己 V馊public号ZL研知己 25考研资料PDF汇总

PTA L2-015 互评成绩

学生互评作业的简单规则是这样定的&#xff1a;每个人的作业会被k个同学评审&#xff0c;得到k个成绩。系统需要去掉一个最高分和一个最低分&#xff0c;将剩下的分数取平均&#xff0c;就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xf…

好物周刊#44:现代终端工具

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Github-Hosts 通过修改 Hosts 解决国内 Github 经常抽风访问不到&#xff0c;每日更新。 2. 餐饮点餐商城 针对…

unity Game视图看不到贴花,但是在Scene视图能看到

解决方法&#xff1a;找到URP的配置文件 &#xff0c;修改Quality–RederScale为1&#xff0c;就可以了&#xff0c;这是unity 的bug&#xff0c;2022版本以后就没有这个问题了

阿珊带你深入理解 async/await 函数

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Android Framework 通过脚本动态修改应用私有文件执行权限

你只活一次 要悦己 脚本配置 Android_source/device/sprd/***/test/test_chmod.rc service test_chmod /vendor/bin/test_chmod.shuser rootdisabledoneshoton property:sys.test_chmodtruestart test_chmodAndroid_source/device/sprd/***/test/test_chmod.sh #!/system/bin/…

Mysql案例之GROUP_CONCAT函数详解

Hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序员&#xff01; 今天这篇文章记录一个最近开发中遇到的mysql实战场景&#xff0c;觉得还挺典型的&#xff0c;就在此做一下记录。 先看一下举例场景&#xff1a; mysql中学生表与学科表通过关…

非线形优化 Matlab和Python (含01规划)

MATLAB&#xff1a;fmincon 在matlab中&#xff0c;一般使用fmincon来解决非线性优化问题 [x,fval,exitflag,output,lambda,grad,hessian]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 一般使用&#xff1a; [x,fval,exitflag]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,non…

Qt ini配置文件

ini文件用于保存用户的设置操作&#xff0c;下列以背景颜色设置为例子 暂时默认设置为白色背景 这段代码放置在主窗口的构造函数中&#xff0c;用于初始化读取ini文件 QString color;QSettings *set new QSettings("color.ini",QSettings::IniFormat);set->begi…

销售管理之反向与正向目标控制

在销售活动中&#xff0c;控制力是关键。但控制力其实分为两种&#xff1a;反向控制和正向控制。本文将深入探讨这两种控制方式&#xff0c;并阐述如何在销售活动中加以应用&#xff0c;以提升销售效果。 一、反向控制&#xff1a;以客户为中心&#xff0c;引导客户需求 反向控…

【智能家居入门1之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据&#xff0c;之后会持续发布如下项目&#xff1a;①可以实现微信小程序控制下位机动作&#xff0c;真正意义上的智能家居&#xff1b;②将网络通讯协议换成MQTT协议再实现上述功能&#xff0c;此时的服务器也不再是ONENET&…

ChaosBlade故障注入工具--cpu,内存,磁盘占用\IO,网络注入等

前言&#xff1a; 本文介绍一款开源的故障注入工具chaosblade&#xff0c;该工具原本由阿里研发&#xff0c;现已开源&#xff1b;工具特点&#xff1a;功能强大&#xff0c;使用简单。 该工具故障注入包含&#xff1a;cpu&#xff0c;内存&#xff0c;磁盘io&#xff0c;磁盘…

计算机网络:应用层知识点汇总

文章目录 一、网络应用模型二、域名系统&#xff08;DNS&#xff09;三、文本传输协议&#xff08;FTP&#xff09;四、电子邮件五、万维网和HTTP协议 一、网络应用模型 p2p也就是对等模型 二、域名系统&#xff08;DNS&#xff09; 我们知道&#xff0c;随着人们建立一个网站…

记一次systemd服务启动找不到Java命令

首先systemd服务文件 /etc/systemd/system/test.service(文件简化处理了) [Unit] Descriptiontest Afternetwork.target [Service] ExecStart/opt/test/bin/test_start.sh [Install] WantedBymulti-user.target其中启动命令ExecStart指向的是一个sh启动脚本&#xff0c; 脚本内…