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

news2024/11/18 3:41:07

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 + 1
	nd = {}
	for k, v in d.items():
		nd[k|a[i]] = min(nd.get(k|a[i],n),v)
	d = nd
	lb[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] += 1


for i in range(q):
    l, r, k = map(int, input().split())
    if k > MAXV:
        print(-1)
        continue

    kbit = [0] * MAXBIT
    for j in range(MAXBIT):
        kbit[j] = k >> j & 1

    left, right = l, r
    while left < right:
        mid = (left + right) >> 1
        ok = True
        for j in range(MAXBIT):
            if kbit[j] == 1 and pre[mid][j] - pre[l - 1][j] == 0:
                ok = False
                break
        if ok:
            right = mid
        else:
            left = mid + 1

    ok = True
    for j in range(MAXBIT):
        if kbit[j] == 1 and pre[right][j] - pre[l - 1][j] == 0:
            ok = False
            break
        if kbit[j] == 0 and pre[right][j] - pre[l - 1][j] > 0:
            ok = False
            break
    if 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] += 1

for j in range(MAXBIT):
    for i in range(n, 0, -1):
        if a[i - 1] >> j & 1:
            nxt[i][j] = i
        elif 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)
        continue

    ok = True
    pos = l
    for j in range(MAXBIT):
        if k >> j & 1:
            if nxt[l][j] == -1 or nxt[l][j] > r:
                ok = False
                break
            pos = max(pos, nxt[l][j])

    if ok:
        v = 0
        for j in range(MAXBIT):
            if pre[pos][j] - pre[l - 1][j] > 0:
                v |= 1 << j
        if v != k:
            ok = False
        else:
            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 -= 1
    l, r, k = map(int, input().split(' '))
    l, r = l - 1, r - 1
    mx, mn = -1, n
    for 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.coloradmin.cn/o/1665043.html

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

相关文章

搜维尔科技:【案例分享】Xsens用于工业制造艺术创新设计平台

用户名称&#xff1a;北京理工大学 主要产品&#xff1a;Xsens MVN Awinda惯性动作捕捉系统 在设计与艺术学院的某实验室内&#xff0c;通过Xsens惯性动作捕捉&#xff0c;对人体动作进行捕捉&#xff0c;得到人体三维运动数据&#xff0c;将捕到的数据用于后续应用研究。…

二维费用背包分组背包

二维费用背包&分组背包 一定要做的

Stable Diffusion的技术原理

一、Stable Diffusion的技术原理 Stable Diffusion是一种基于Latent Diffusion Models&#xff08;LDMs&#xff09;实现的文本到图像&#xff08;text-to-image&#xff09;生成模型。其工作原理主要基于扩散过程&#xff0c;通过模拟数据的随机演化行为&#xff0c;实现数据…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

Java | Leetcode Java题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (dfs(board, words, i, j, 0)) return t…

超高频工业读写器的特点介绍及其适用场景!

超高频工业读写器根据设计方式不同&#xff0c;可分为一体式读写器和分体式读写器&#xff0c;不同读写器特点不同&#xff0c;适用场景也不同&#xff0c;下面我们就一起来了解一下超高频分体读写器适用场景有哪些。 超高频分体读写器介绍 超高频分体读写器是一种射频识别(R…

AI + Web3 如何打造全新创作者经济模型?

可编程 IP 的兴起&#xff0c;借助人工智能极大提高创作效率和效能&#xff0c;让 Web3 用户体会到了自主创作和产品制作的乐趣。然而&#xff0c;你知道 AI 时代来临的背景下&#xff0c;创作者经济模型又该如何在 Web3 技术的加持下走向更成熟的运作轨道吗&#xff1f;第 43 …

13.Netty组件EventLoopGroup和EventLoop介绍

EventLoop 是一个单线程的执行器&#xff08;同时维护了一个Selector&#xff09;&#xff0c;里面有run方法处理Channel上源源不断的io事件。 1.继承java.util.concurrent.ScheduledExecutorService因此包含了线程池中所有的方法。 2.继承netty自己的OrderedEventExecutor …

MVC:一种设计模式而非软件架构

在软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;经常被提及&#xff0c;但很多人对其定位存在误解。本文将澄清一个常见的误区&#xff1a;MVC是一种设计模式&#xff0c;而非软件架构。 一、MVC简介 MVC&#xff0c;即模型&#xff08;Model&a…

CCF CSP 认证考试历年真题满分题解(所有前四题)

CCF CSP 认证考试历年真题满分题解&#xff08;所有前四题&#xff09; 前言 原本刷题的动机仅仅是为研究生复试的机试环节做准备&#xff0c;我通过刷csp的真题来锻炼自己&#xff0c;因为上次的机试题目全部是csp真题&#xff0c;最后也是顺利上岸。空闲之际&#xff0c;我…

uni-segmented-control插件使用

dcloud插件市场 前端/uniapp 1.HBuildX打开目标项目 2.进入dcloud插件市场下载目标插件 3.看到如下提示(已经可以在目标项目中使用插件啦) 4.项目正式使用

创新指南 | 生成式AI如何引领企业创新未来?

2023年麦肯锡全球数字战略调查了1000多名受访者&#xff0c;发现&#xff1a;建立创新文化的组织与它们应用包括生成式AI在内的最新数字技术提高产出的能力之间有着惊人的强关联。 本文探讨了顶尖创新企业采取的五项行动&#xff0c;使它们与同行之间拉开距离&#xff0c;并在使…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

【QVariant类型剖析】

QVariant类型剖析 &#x1f31f; 官方文档中给出的定义&#x1f31f; 特性&#x1f338;QVariant实战应用&#x1f338;项目成果展示 &#x1f31f; 官方文档中给出的定义 &#x1f4d8;Because C forbids unions from including types that have non-default constructors or…

【C++算法】队列相关经典算法题

1. N叉树的层序遍历 首先我们遇到这个题目&#xff0c;没有任何思路&#xff0c;我们就可以来模拟一下层序的流程&#xff0c;首先我们肯定是访问根节点1&#xff0c;访问之后呢就是访问下一层的最左节点3&#xff0c;此时第一层的节点1已经访问过了就可以不要了&#xff0c;然…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时&#xff0c;你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

消费增值:绿色积分引领电商潮流

消费增值的玩法确实为电商平台提供了一种新颖的用户激励机制&#xff0c;通过积分返利和增值机制&#xff0c;吸引消费者持续参与并提升用户粘性。以下是对您提供的信息的进一步解析和扩展&#xff1a; 消费增值玩法解析 商城消费返利&#xff1a; 每笔消费订单&#xff0c;商…

Celery Redis 集群版连接和PyCharm启动配置

目录 使用Redis cluster版作为broker原因 PyCharm配置 使用Redis cluster版作为broker 在celery5及其之前版本&#xff0c;需要配置如下才可行 celery_app.conf.update( broker_transport_options{“global_keyprefix”: “{celery}:”}, ) 原因 https://github.com/celery/…

深度学习:基于人工神经网络ANN的降雨预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 本专栏涉及创建深度学习模型、处理非结构化数据以及指导复杂的模型&#xff0c;如卷积神经网络(CNN)、递归神经网络 (RNN)&#xff0c;包括长短期记忆 (LSTM) 、门控循环单元 (GRU)、自动编码器 (AE)、受限玻尔兹曼机(…

alist网盘自动同步

alist网盘自动同步 alist可以设置目录定时转存到各个网盘&#xff0c;做到夸网盘&#xff0c;多备份的效果可以将自己挂载的alist 下的各个目录相互间进行同步&#xff0c;原理是采用alist原始api调用执行&#xff0c;同步原理是匹配文件名称是否相同&#xff0c;相同会跳过同…