算法刷题:最大异或对(Trie树扩展)、食物链(并查集扩展)

目录

  • 引言
  • 一、最大异或对(Trie树扩展)
    • 1.题目描述
    • 2.解题思路
    • 3.代码实现
    • 4.测试
  • 二、食物链(并查集扩展)
    • 1.题目描述
    • 2.解题思路
    • 3.代码实现
    • 4.测试

引言

这两个扩展题能够让我们更加的熟悉Trie树和并查集的使用,这两道题可以说是比较难的了,所以说还是好好对待吧。

一、最大异或对(Trie树扩展)

1.题目描述

在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式
第一行输入一个整数 N。
第二行输入 N 个整数 A1~AN。输出格式
输出一个整数表示答案。数据范围
1≤N≤105,0≤Ai<231输入样例:
3
1 2 3输出样例:
3

2.解题思路

  • 首先最开始当然是用暴力做一下,如下所示,很明显是O(n^2)的一个时间复杂度,然后这个数据是10 ^ 5,那就是执行10 ^ 10次,然后一般C++的时间范围在10 ^ 9内一般都是可以过的,这个当然就TLE了。
int res = 0;
for (int i = 0; i < n; ++i)
{for (int j = 0; j < i; ++j){res = max(res, a[i] ^ a[j]);}
}
  • 然后就想怎么优化了,我们注意第二层循环是查找当然数中与a[i]异或的最大值,我们发现数据是小于 2 ^ 31 - 1的,也就是最多31位,那么是最大的,肯定先从最高位找有没有一个数跟a[i]的最高位不一样,如果有那就把他们集合到一块,没有那就挑相同的,然后找第29位有没有与a[i]第29位不同位的树,如果没有那就找相同的,然后就这样找到第0位,肯定就是与a[i]异或最大的数了,这也是一种贪心的思想,具体图解看如下的例子:
    如果右边是已经有的Trie树了,我们要找与110异或最大的,那么最高位是1,我们就要找0,然后有0,然后看下一位是1,我们就要找0,没有0,那就只能是1了,然后下一位是0,我们要找1,那就找到了,所以最终与110异或最大的数是011
    在这里插入图片描述

3.代码实现

#include <cstdio>
#include <iostream>using namespace std;const int N = 1e5+10, M = 31 * N;  // 最大有M个结点int a[N];
int son[M][2], idx;  // M个结点,每个结点两个儿子0,1
int n;void insert(int x)
{int p = 0;for(int i = 30; i >= 0; --i){int u = x >> i & 1;if(!son[p][u]) son[p][u] = ++idx;p = son[p][u];}
}int query(int x)
{int p = 0, res = 0;for(int i = 30; i >= 0; --i){int u = x >> i & 1;if(son[p][!u])  // 找不同的{res = res * 2 + !u;p = son[p][!u];}else  // 如果不存在,那只能退而求其次{res = res * 2 + u;p = son[p][u];}}return res;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &a[i]);int res = 0;for(int i = 0; i < n; ++i){insert(a[i]);int t = query(a[i]);  //查询与a[i]异或最大的数res = max(res, a[i] ^ t);}printf("%d\n", res);return 0;
}

4.测试

在这里插入图片描述

在这里插入图片描述

二、食物链(并查集扩展)

1.题目描述

动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:
第一种说法是 1 X Y,表示 X 和 Y 是同类。
第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
当前的话与前面的某些真的话冲突,就是假话;
当前的话中 X 或 Y 比 N 大,就是假话;
当前的话表示 X 吃 X,就是假话。你的任务是根据给定的 N 和 K 句话,输出假话的总数。输入格式
第一行是两个整数 N 和 K,以一个空格分隔。
以下 K 行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。
若 D=1,则表示 X 和 Y 是同类。
若 D=2,则表示 X 吃 Y。输出格式
只有一个整数,表示假话的数目。数据范围
1≤N≤50000 ,0≤K≤100000输入样例:
100 7
1 101 1 
2 1 2
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5 5输出样例:
3

2.解题思路

这道题是要输出谎话的次数,然后x,y > n,就不说了很好判断,然后其实就是判断是不是同类,是不是能吃的关系
思路就是如下图的关系,是不是同类取决于到根结点的距离是否相同,吃与被吃的关系却决于到根结点的距离,当然这些距离都要 mod 3

3.代码实现

关于最后 d[px] 的推导我画了张图,虽然很丑,但是关系描述的还是很清晰的,然后注释写的也比较详细,不懂得可以多看看
在这里插入图片描述

在这里插入图片描述

#include <cstdio>
#include <iostream>using namespace std;const int N = 5e5+10;int p[N], d[N];  // d[i]是i号结点到根结点的距离
int n, m;int find(int x)
{if(x != p[x]) {int t = find(p[x]);d[x] += d[p[x]];  // 必须先执行find操作,将d[p[x]是真正的到根结点的距离,而不是到上一个结点的距离p[x] = t;  // 路径压缩}return p[x];
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i) p[i] = i;int res = 0;while(m--){int t, x, y;scanf("%d%d%d", &t, &x, &y);int px = find(x), py = find(y);if(x > n || y > n) res++;else{if(t == 1)  // 同类{if(px == py && (d[x] - d[y]) % 3) res++;  //如果是一个集合的,并且到根结点的距离不同,说明不是一个类的else if(px != py)  // 刚开始还没插进集合里{p[px] = py;  // 让x的根结点的父亲为y的根结点d[px] = d[y] - d[x];  // 只用将x根结点到y根结点的距离一改,之后的话,会通过上面的find函数自动修改的}}else  // x吃y{int link = 1;  // 这里给出2也是可以的,x比y多1或者2 都表示x吃yif(px == py && (d[x] - d[y] - link) % 3) res++;else if(px != py){p[px] = py;d[px] = d[y] - d[x] + link;}}}}printf("%d\n", res);return 0;
}

4.测试

在这里插入图片描述

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

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

相关文章

MySQL:子查询

子查询 子查询是嵌套在较大查询中的 SQL 查询&#xff0c;也称内部查询或内部选择&#xff0c;包含子查询的语句也称为外部查询或外部选择。简单来说&#xff0c;子查询就是指将一个 select 查询&#xff08;子查询&#xff09;的结果作为另一个 SQL 语句&#xff08;主查询&a…

Leetcode的AC指南 —— 哈希法/双指针:15. 三数之和

摘要&#xff1a; Leetcode的AC指南 —— 15. 三数之和。题目介绍&#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且…

Android—— MIPI屏调试

一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点&#xff0c;关闭其他显示面板接口&#xff08;&edp_panel、&lvds_panel&#xff09; --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …

水库大坝安全监测设计与施工经验

随着我国的科技水平不断上升&#xff0c;带动了我国的水电建设向更高层次发展。目前&#xff0c;我国的水电站大坝已有上百座&#xff0c;并且大坝安全检测仪器质量与先进技术不断更新发展&#xff0c;如今水电站大坝数据信息采集与观测资料分析&#xff0c;能够有效提高水库大…

Linux系统安装MySQL

Linux系统安装MySQL 第一步&#xff1a;下载YUM wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm第二步&#xff1a;安装MySQL的YUM 仓库 rpm -ivh mysql57-community-release-el7-11.noarch.rpm第三步&#xff1a;查看MySQL版本 yum repolist …

ESP32:整合存储配网信息和MQTT笔记

文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32&#xff0c;很多知识点都忘记了。今天测试一下MQTT&#xff0c;做个笔记。…

基于ssm的4S店预约保养系统开发+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

如何成功拿下uniapp生命周期?

uniapp介绍 Uniapp作为一款跨平台应用开发框架&#xff0c;具有两个生命周期&#xff1a; 组件生命周期页面生命周期什么是页面&#xff1f; pages下面的.vue或者.nvue&#xff08;app端&#xff09;文件就是页面 什么是组件&#xff1f; 一般通常会把项目中的组件放在com…

web前端开发html/css求职简介/个人简介小白网页设计

效果图展示&#xff1a; html界面展示&#xff1a; html/css代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.…

驶入未来:网约车运营数据揭秘与可视化大屏展示

驶入未来&#xff1a;网约车运营数据揭秘与可视化大屏展示 引言1. 数据获取与准备1.1 数据来源1.2 数据结构 2. 数据处理模块2.1 数据清洗2.2 数据转换2.3 数据整合 3. 数据可视化大屏4. 创新性可视化展示5. 应用与决策支持 结语 引言 数字化时代下&#xff0c;网约车运营数据…

轮滑培训机构会员系统,轮滑俱乐部会员卡管理软件教程

轮滑培训机构会员系统&#xff0c;轮滑俱乐部会员卡管理软件教程 一、软件程序问答 1、轮滑会员管理&#xff0c;那么会员卡是否可以直接用手机号呢&#xff1f; 如下图&#xff0c;软件以 佳易王轮滑会员管理系统V16.2为例说明 会员在登记的时候&#xff0c;会员卡可以直…

python实现图像的二维傅里叶变换——冈萨雷斯数字图像处理

原理 二维傅里叶变换是一种在图像处理中常用的数学工具&#xff0c;它将图像从空间域&#xff08;我们通常看到的像素排列&#xff09;转换到频率域。这种变换揭示了图像的频率成分&#xff0c;有助于进行各种图像分析和处理&#xff0c;如滤波、图像增强、边缘检测等。 在数学…

按摩上门预约小程序源码系统 开发组合:PHP+MySQL 附带完整的搭建教程

现代生活节奏的加快&#xff0c;人们越来越注重健康与放松。按摩作为传统的舒缓方式&#xff0c;市场需求逐年上升。然而&#xff0c;传统的按摩服务预约方式较为繁琐&#xff0c;用户需拨打热线电话或前往实体店进行预约&#xff0c;这无疑增加了用户的操作成本。因此&#xf…

【JavaScript】异步解决方案的发展历程

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

揭秘营销返利模式!

随着互联网的普及和发展&#xff0c;越来越多的商家开始采用营销返利模式来吸引消费者。这种模式不仅可以提高销售额&#xff0c;还可以让消费者获得实实在在的优惠。本文将详细解析营销返利模式的秘密&#xff0c;让你轻松掌握这一有效的营销策略&#xff01; 一、什么是营销返…

C++继承与派生——(6)派生类的析构函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 站在巨人的肩上&#xff0c;是为了超过…

关于Omlox定位标准(一)——omlox hub

关于Omlox定位标准 Omlox是世界上第一个开放的定位标准&#xff0c;旨在实现灵活的实时定位解决方案&#xff0c;&#xff0c;可以使用来自各个制造商的单元。“omlox"一词源自拉丁词汇"omni”&#xff08;无处不在&#xff09;和"locus"&#xff08;位置…

18国签署,全球首份《安全AI系统开发指南》发布

内容概述&#xff1a; 2023年11月27日&#xff0c;美国、英国和其他十几个国家公布了首份关于如何保护AI免受流氓行为侵害的详细国际协议《安全AI系统开发指南》&#xff0c;敦促企业打造“设计安全”的AI系统。协议由英国国家网络安全中心&#xff08;NCSC&#xff09;主导&a…

基于电商场景的高并发RocketMQ实战-Broker写入读取流程性能优化总结、Broker基于Pull模式的主从复制原理

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

【Spark精讲】一文讲透SparkSQL执行过程

SparkSQL执行过程 逻辑计划 逻辑计划阶段会将用户所写的 SQL语句转换成树型数据结构(逻辑算子树)&#xff0c; SQL语句中蕴含的逻辑映射到逻辑算子树的不同节点。 顾名思义&#xff0c;逻辑计划阶段生成的逻辑算子树并不会直接提交执行&#xff0c;仅作为中间阶段 。 最终逻辑…