2024年4月12日饿了么春招实习试题【第二题:魔法师】-题目+题解+在线评测【二分】

2024年4月12日饿了么春招实习试题【第二题:魔法师】-题目+题解+在线评测【二分】

  • 题目描述:
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 评测数据与规模
  • 解题思路一:
  • 解题思路二:
  • 解题思路三:动态规划

题目描述:

塔子哥是一名魔法师,他有一个由 n 个正整数组成的魔法序列 A。现在他想对这个序列施展魔法,每次施展魔法会给出三个正整数 l,r,k,塔子哥想知道在区间 [l,r] 中是否存在一个位置 i,使得将区间 [l,i] 中的所有数进行按位或运算的结果等于 k。如果存在,输出满足条件的最小的 i,否则输出 −1。

输入格式

第一行包含两个正整数 n,Q,表示魔法序列的长度和施展魔法的次数。

第二行包含 n 个正整数 A1,A2,…,An,表示魔法序列 A。

接下来 Q 行,每行包含三个正整数 l,r,k,表示一次魔法的施展。

输出格式

对于每次施展魔法,输出一行一个整数,表示答案,如果不存在满足条件的位置则输出 −1。

样例输入

5 5
3 2 3 3 6
1 2 3
1 5 7
1 4 7
2 2 2
2 3 7

样例输出

1
5
-1
2
-1

评测数据与规模

1 ≤ n , Q ≤ 1 0 6 , 1 ≤ l ≤ r ≤ n , 0 ≤ A _ i , k < 2 30 。 1 \le n,Q \le 10^6,1 \le l \le r \le n,0 \le A\_i, k < 2^{30}。 1n,Q1061lrn0A_i,k<230

OJ链接:
https://codefun2000.com/p/P1817

解题思路一:

在这里插入图片描述

import sys
input = lambda : sys.stdin.readline().strip()
n,q = map(int, input().split())
a = list(map(int, input().split()))
lb = [None] * (n + 1)
d = dict()
for i in range(n-1,-1,-1):d[a[i]] = i + 1nd = {}for k, v in d.items():nd[k|a[i]] = min(nd.get(k|a[i],n),v)d = ndlb[i + 1] = d.copy()
for _ in range(q):l,r,k = map(int, input().split())	if k not in lb[l] or r < lb[l][k]:print("-1")else:print(lb[l][k])

时间复杂度:O(nlogU + 1)
空间复杂度:O(nlogU)

解题思路二:

在这里插入图片描述

n, q = map(int, input().split())
a = list(map(int, input().split()))MAXBIT = 30
MAXV = 2**30 - 1
pre = [[0 for _ in range(MAXBIT)] for i in range(n + 1)]
for i in range(1, n + 1):for j in range(MAXBIT):pre[i][j] = pre[i - 1][j]if a[i - 1] >> j & 1:pre[i][j] += 1for i in range(q):l, r, k = map(int, input().split())if k > MAXV:print(-1)continuekbit = [0] * MAXBITfor j in range(MAXBIT):kbit[j] = k >> j & 1left, right = l, rwhile left < right:mid = (left + right) >> 1ok = Truefor j in range(MAXBIT):if kbit[j] == 1 and pre[mid][j] - pre[l - 1][j] == 0:ok = Falsebreakif ok:right = midelse:left = mid + 1ok = Truefor j in range(MAXBIT):if kbit[j] == 1 and pre[right][j] - pre[l - 1][j] == 0:ok = Falsebreakif kbit[j] == 0 and pre[right][j] - pre[l - 1][j] > 0:ok = Falsebreakif ok:print(right)else:print(-1)n, q = map(int, input().split())
a = list(map(int, input().split()))MAXBIT = 30
MAXV = 2**30 - 1
pre = [[0 for _ in range(MAXBIT)] for _ in range(n + 1)]
nxt = [[-1 for _ in range(MAXBIT)] for _ in range(n + 1)]
for i in range(1, n + 1):for j in range(MAXBIT):pre[i][j] = pre[i - 1][j]if a[i - 1] >> j & 1:pre[i][j] += 1for j in range(MAXBIT):for i in range(n, 0, -1):if a[i - 1] >> j & 1:nxt[i][j] = ielif i < n:nxt[i][j] = nxt[i + 1][j]for i in range(q):l, r, k = map(int, input().split())if k > MAXV:print(-1)continueok = Truepos = lfor j in range(MAXBIT):if k >> j & 1:if nxt[l][j] == -1 or nxt[l][j] > r:ok = Falsebreakpos = max(pos, nxt[l][j])if ok:v = 0for j in range(MAXBIT):if pre[pos][j] - pre[l - 1][j] > 0:v |= 1 << jif v != k:ok = Falseelse:print(pos)if not ok:print(-1)

时间复杂度:O(n)
空间复杂度:O(30q)

解题思路三:动态规划

n, q = map(int, input().split(' '))
f = [[n] * 30 for _ in range(n + 1)]
a = list(map(int, input().split(' '))) + [0]
for i in range(n - 1, -1, -1):for j in range(30):f[i][j] = i if (a[i] >> j & 1) == 1 else f[i + 1][j]
while q > 0:q -= 1l, r, k = map(int, input().split(' '))l, r = l - 1, r - 1mx, mn = -1, nfor j in range(30):if (k >> j & 1) == 1:mx = max(mx, f[l][j])else:mn = min(mn, f[l][j])if mx <= r and mx < mn:print(mx + 1)else:print(-1)

时间复杂度:O(n)
空间复杂度:O(n)

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

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

相关文章

信息系统架构模型_3.企业数据交换总线

1.企业数据交换总线 实践中&#xff0c;还有一种较常用的架构&#xff0c;即企业数据交换总线&#xff0c;即不同的企业应用之间进行信息交换的公共通道&#xff0c;如图1所示。 图1 企业数据交换总线架构 这种架构在大型企业不同应用系统进行信息交换时使用较普遍&am…

【18-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

CSS 定位

为什么需要浮动? 我们在访问一些网站的时候, 经常会遇到如下这种情况, 有一个组件, 一直固定在屏幕的固定位置, 无论你如何滑动这个网页, 就会固定在哪里, 如下, 下图是王者荣耀的一个官网: 要实现上面的效果, 标准流或者是浮动是无法快速实现的, 此时就需要使用定位来实现.…

力扣刷题--数组--第一天

一、数组 数组特点&#xff1a; 连续内存空间存储得数据元素类型一致数组可以通过下标索引查找数据元素&#xff0c;可以删除、替换、添加元素等 1.1 二分查找 使用二分查找需满足得条件&#xff1a; 数组是有序的&#xff1b;数组中没有重复元素&#xff1b;查找的target…

Excel实用技巧持续学习

1、Excel高效设置图标格式&#xff1a; 2、饼图可以统一设置数据标签在图外面&#xff01;&#xff01; 环形图不可以&#xff0c;但是可以中间手动加上白色圆形&#xff0c;将饼图变为圆环。 可以设置标签的文本显示&#xff1a; 3、饼图和环形图最好进行排序&#xff01;显得…

解决docker安装Wordpress速度过慢的问题

先可以在dockerhub上查看Wordpress的详情&#xff1a; Dockerhttps://hub.docker.com/search?qwordpress 具体速度慢的问题如下&#xff1a; 现在打开docker右上角的设置图标&#xff0c;并进入docker engine&#xff0c;添加如下代码&#xff1a; "registry-mirrors&…

即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…

1290.二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进制…

Python大数据分析——Logistic回归模型

Logistic回归模型 概念理论分析模型评估混淆矩阵ROC曲线KS曲线 函数示例 概念 之前的回归的变量是连续的数值变量&#xff1b;而Logistics回归是二元离散值&#xff0c;用来解决二分类问题。 理论分析 上式中的hβ(X)也被称为Loqistic回归模型&#xff0c;它是将线性回归模型…

Zotero 使用入门(笔记)

参考文献&#xff1a;Zotero入门完整教程-共27节-免费&#xff0c;李长太>&#xff0c; 仅供参考学习

【详细教程】基于pyEchart的封装(附代码)

目 录 一、项目结构 二、文件封装 2.1echart.py 2.2pyechartMock.py 三、结果 3.1柱状图 3.2折线图 3.3饼状图 最近在学习pyechart&#xff0c;老师要我们画几个简单的图&#xff0c;比如折线图&#xff0c;柱状图&#xff0c;饼状图&#xff0c;我这里在参考pyechart…

【数据结构】顺序表与链表的差异

顺序表和链表都是线性表&#xff0c;它们有着相似的部分&#xff0c;但是同时也有着很大的差异。 存储空间上的差异&#xff1a; 对于插入上的不同点&#xff0c;顺序表在空间不够时需要扩容&#xff0c;而如果在使用realloc函数去扩容&#xff0c;会有原地扩容和异地扩容两种情…