Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树)

2024-05-29 08:20

本文主要是介绍Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目截图

在这里插入图片描述

题目分析

每次1操作将会分裂成两块区间长度,以最近右端点记录左侧区间的长度即可
因此涉及到单点更新和区间查询
然后左右侧最近端点则使用redBlackTree,也就是python中的sortedlist

ac code

type seg []int// 把 i 处的值改成 val
func (t seg) update(o, l, r, i, val int) {if l == r {t[o] = valreturn}m := (l + r) >> 1if i <= m {t.update(o<<1, l, m, i, val)} else {t.update(o<<1|1, m+1, r, i, val)}t[o] = max(t[o<<1], t[o<<1|1])
}// 查询 [0,R] 中的最大值
func (t seg) query(o, l, r, R int) int {if r <= R {return t[o]}m := (l + r) >> 1if R <= m {return t.query(o<<1, l, m, R)}return max(t[o<<1], t.query(o<<1|1, m+1, r, R))
}func getResults(queries [][]int) (ans []bool) {m := 0for _, q := range queries {m = max(m, q[1])}m++set := redblacktree.New[int, struct{}]() // kv对,v就这样摆着先set.Put(0, struct{}{}) // 哨兵set.Put(m, struct{}{})t := make(seg, 2<<bits.Len(uint(m)))for _, q := range queries {x := q[1]pre, _ := set.Floor(x - 1) // x 左侧最近障碍物的位置if q[0] == 1 {nxt, _ := set.Ceiling(x) // x 右侧最近障碍物的位置set.Put(x, struct{}{})t.update(1, 0, m, x, x-pre.Key)       // 更新 d[x] = x - pret.update(1, 0, m, nxt.Key, nxt.Key-x) // 更新 d[nxt] = nxt - x} else {// 最大长度要么是 [0,pre] 中的最大 d,要么是 [pre,x] 这一段的长度maxGap := max(t.query(1, 0, m, pre.Key), x-pre.Key)ans = append(ans, maxGap >= q[2])}}return
}

这篇关于Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013133

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更