Leetcode 3161. Block Placement Queries

  • Leetcode 3161. Block Placement Queries
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3161. Block Placement Queries

1. 解题思路

这一题没有搞定,后来是看了答案才多少有了些思路的,感觉人生真的是玄学拉满,每次我休息一整天完全没有学习的时候,哪怕只是出于某些理由被动休息的时候,第二天都会很倒霉,早上起来曼城居然翻车输给曼联了,然后这周的两道hard的题目都没能自力搞定,尤其是后面周赛399的第四题,看了答案都有点云里雾里,简直了……

算了,不发牢骚了,言归正传,这道题思路上的话用的是segment tree(这部分内容可以参阅我之前写的博客:经典算法:Segment Tree),这一点我其实也想到了,因为是需要不断地求0到某一个区间x之间的间隔空间的最大值,这个问题非常适合segment tree的结构,但是这里的问题在于,每插入一块挡板的时候,前后两块挡板之间所有位置上其对应的间隔都会发生变化,因此要改变value的值就不是一个,而是一整个subarray,这会导致算法复杂度过高,我基本就是卡死在了这个地方。

而看了一下大佬们的解答,发现其它部分的思路和我一模一样,但是最核心的区别在于,segment tree当中虽然同样是按照每一个位置进行维护其所在的区间的大小的,但是他只记录了有挡板位置的前侧区间的大小,对于没有放置挡板的位置,虽然它的所处区间的大小也发生了变化,但是必然不会是最大的值,因此没有必要去维护这个位置上的值了。

由此,大佬们就极大地缩减了题目的算法复杂度,使之通过所有的测试样例了。

委实有点精妙了……

2. 代码实现

给出我自己仿写的python代码实现如下:

class SegmentTree:def __init__(self, arr):self.length = len(arr)self.tree = self.build(arr)def feature_func(self, *args):return max(args)def build(self, arr):n = len(arr)tree = [0 for _ in range(2*n)]for i in range(n):tree[i+n] = arr[i]for i in range(n-1, 0, -1):tree[i] = self.feature_func(tree[i<<1], tree[(i<<1) | 1])return treedef update(self, idx, val):idx = idx + self.lengthself.tree[idx] = valwhile idx > 1:self.tree[idx>>1] = self.feature_func(self.tree[idx], self.tree[idx ^ 1])idx = idx>>1returndef query(self, lb, rb):lb += self.length rb += self.lengthnodes = []while lb < rb:if lb & 1 == 1:nodes.append(self.tree[lb])lb += 1if rb & 1 == 0:nodes.append(self.tree[rb])rb -= 1lb = lb >> 1rb = rb >> 1if lb == rb:nodes.append(self.tree[rb])return self.feature_func(*nodes)class Solution:def getResults(self, queries: List[List[int]]) -> List[bool]:n = max(q[1] for q in queries)segment_tree = SegmentTree([0 for _ in range(n+1)])obstacles = [0]ans = []for query in queries:if query[0] == 1:x = query[1]idx = bisect.bisect_left(obstacles, x)prev = obstacles[idx-1]segment_tree.update(x, x-prev)if idx < len(obstacles):nxt = obstacles[idx]segment_tree.update(nxt, nxt-x)bisect.insort(obstacles, x)else:x, sz = query[1:]idx = bisect.bisect_right(obstacles, x)prev = obstacles[idx-1]_max = max(x-prev, segment_tree.query(0, prev))ans.append(sz <= _max)return ans

提交代码评测得到:耗时5706ms,占用内存87MB。

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

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

相关文章

解决git克隆项目出现fatal无法访问git clone https://github.com/lvgl/lvgl.git

Windows 11系统 报错 $ git clone https://github.com/lvgl/lvgl.git Cloning into lvgl... fatal: unable to access https://github.com/lvgl/lvgl.git/: Failed to connect to github.com port 443 after 21141 ms: Couldnt connect to server 解决方法 git运行这两段代码…

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱&#xff0c;密码&#xff0c;验证码开启官方邮箱&#xff0c;用来发验证码&#xff08;QQ 网易都支持开启smtp协议&#xff0c;找教程&#xff0c;用邮箱不用手机号是为了省买发短信云服务的钱&a…

ASP+ACCESS客户管理信息系统

摘要 本文介绍了客户管理系统的实现方法。目的在于让大家共享学习和运用这一语言的体会和收获。本系统是Internet/Intranet环境下面向电子商务的客户管理&#xff0c;通过企业管理技术、电子商务和信息技术的高度集成&#xff0c;讨论了客户管理系统的系统构架、系统的工作…

Rust之初识

1、Rust Linux安装 登录进入linux以后&#xff0c;执行&#xff1a; curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh当提示&#xff1a; Rust is installed now. Great!意味着安装成功了。打开另一个shell页&#xff0c;查看&#xff1a;rustc --version&#x…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈…

git使用简述

1、工作区、暂存区、版本库 Git 是一个开源的分布式版本控制系统&#xff0c;它允许多个开发者同时在同一个项目上工作&#xff0c;而不会互相干扰。Git 通过三个主要的区域来管理文件的变更&#xff1a;工作区&#xff08;Working Directory&#xff09;、暂存区&#xff08;…

python 面对对象 类 魔法方法

魔法方法 一、__init__ 构造函数&#xff0c;可以理解为初始化 触发条件&#xff1a;在实例化的时候就会触发 class People():def __init__(self, name):print(init被执行)self.name namedef eat(self):print(f{self.name}要吃饭)a People(张三) a.eat() # in…

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张

海外抖音TK自动挂机&#xff0c;手机全自动挂机&#xff0c;每天轻松搞2张 课程获取方式&#xff1a; https://zzmbk.com/

整理好了!2024年最常见 20 道 Redis面试题(七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;六&#xff09;-CSDN博客 十三、如何保证 Redis 的高可用性&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对数据库&#xff0c;它通常被…

揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!

文章目录 前言1.标题1.1 使用 和 - 标记一级和二级标题1.2 使用 # 号标记 2.段落格式2.1 字体2.2 分割线2.3 删除线2.4 下划线2.5 脚注 3.列表3.1 无序列表3.2 有序列表3.3 列表嵌套 4.区块4.1 区块中使用列表4.2 列表中使用区块 5.代码代码区块 6.链接7.图片8.表格9.高级技巧…

mysql实战——XtraBackup二进制包安装

1、二进制包下载网站 Software Downloads - Percona 2、安装xtrabackup 解压安装包 tar xvf percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17.tar.gz -C /usr/local 进入目录 cd percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17/ 安装依赖 yum install perl-Dig…

正运动视觉与运动一体机小课堂----三分钟系列

【视觉运控一体机小课堂】三分钟搭建机器视觉开发环境-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂】三分钟读取本地图像-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂】三分钟实现相机采集和图像保存-正运动技术 (zmotion.com.cn) 【视觉运控一体机小课堂…

java里面反射和动态代理的基础知识

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时检查和修改类、接口、字段和方法等元数据的行为。通过反射&#xff0c;你可以加载类、实例化对象、调用方法、获取和修改字段的值等&#xff0c;而无需在编译…

Fortran: stdlib标准库

Fortran 标准库 stdlib_logger,stdlib_error, stdlib_sorting,stdlib_optval模块挺好用 封装 stdlib_logger和stdlib_error: M_logger.F90 module M_loggeruse stdlib_loggeruse stdlib_error containssubroutine info(message,module,procedure)character(len*),intent(in):…

2024.5.25期末测试总结

成绩&#xff1a; 配置&#xff1a; 可能与实际有些出入 题目&#xff1a; 第一题&#xff1a; 代码思路&#xff1a; 一道模拟题&#xff0c;按照公式计算出sumpow(2,i)&#xff0c;判断sum>H&#xff0c;输出 代码&#xff1a; #include<bits/stdc.h> using name…

Java—内部类

Java—内部类 一、内部类二、应用特点三、分类3.1、普通内部类&#xff1a;直接将一个类的定义放在另外一个类的类体中3.2、静态内部类3.3、局部内部类 一、内部类 一个类的定义出现在另外一个类&#xff0c;那么这个出现的类就叫内部类(Inner)。 内部类所在的类叫做外部类(Ou…

Java匿名内部类的使用

演示匿名内部类的使用&#xff0c;很重要 package com.shedu.Inner;/*** 演示匿名内部类的使用*/ public class AnonymousInnerClass {//外部其他类public static void main(String[] args) {Outer04 outer04 new Outer04();outer04.method();} }class Outer04{//外部类priva…

在线软件包管理

1.APT工作原理 APT&#xff08;Advanced Packaging Tool&#xff09;是Debian系列Linux操作系统中广泛使用的包管理工具&#xff0c;它为用户提供了从软件仓库搜索、安装、升级和卸载软件包的功能。其工作原理具体分析如下&#xff1a; 1. **集中式软件仓库机制**&#xff1a…

Linux之Nginx

1、Nginx 1.1、什么是Nginx Nginx最初由Igor Sysoev开发&#xff0c;最早在2004年公开发布。它被设计为一个轻量级、高性能的服务器&#xff0c;能够处理大量并发连接而不消耗过多的系统资源。Nginx的架构采用了事件驱动的方式&#xff0c;能够高效地处理请求。它的模块化设计使…

python-情报加密副本

【问题描述】某情报机构采用公用电话传递数据&#xff0c;数据是5位的整数&#xff0c;在传递过程中是加密的。加密规则如下&#xff1a;每位数字都加上8,然后用和除以7的余数代替该数字&#xff0c;再将第1位和第5位交换&#xff0c;第2位和第4位交换。请编写程序&#xff0c;…