2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k
2022-12-16:给你一个长度为n的数组,并询问q次
每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x
每条查询返回true或者false。
1 <= n, q <= 10^5
k <= 10
1 <= x <= 10^8。
答案2022-12-16:
线段树。
代码用go语言编写。代码如下:
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
N := 100
K := 10
V := 100
testTimes := 5000
queryTimes := 100
fmt.Println("测试开始")
for i := 0; i < testTimes; i++ {
n := rand.Intn(N) + 1
k := rand.Intn(K) + 1
arr := randomArray(n, V)
st := NewSegmentTree(arr, k)
right := NewRight(arr, k)
for j := 0; j < queryTimes; j++ {
a := rand.Intn(n)
b := rand.Intn(n)
l := GetMin(a, b)
r := GetMax(a, b)
ans1 := st.topKSum(l, r)
ans2 := right.topKSum(l, r)
if ans1 != ans2 {
fmt.Println("出错了!")
fmt.Println(ans1)
fmt.Println(ans2)
break
}
}
}
fmt.Println("测试结束")
}
func GetMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func GetMin(a, b int) int {
if a < b {
return a
} else {
return b
}
}
type SegmentTree struct {
n int
k int
// private int[] max;
// private int[][] max = new int[][10];
max [][]int
query [][]int
}
func NewSegmentTree(arr []int, K int) *SegmentTree {
n := len(arr)
k := K
max := make([][]int, (n+1)<<2)
query := make([][]int, (n+1)<<2)
for i := 0; i < len(max); i++ {
max[i] = make([]int, k)
query[i] = make([]int, k)
}
ans := &SegmentTree{}
ans.n = n
ans.k = k
ans.max = max
ans.query = query
for i := 0; i < n; i++ {
ans.update(i, arr[i])
}
return ans
}
func (this *SegmentTree) topKSum(l int, r int) int {
this.collect(l+1, r+1, 1, this.n, 1)
sum := 0
for _, num := range this.query[1] {
sum += num
}
return sum
}
func (this *SegmentTree) update(i int, v int) {
this.update0(i+1, i+1, v, 1, this.n, 1)
}
func (this *SegmentTree) update0(L int, R int, C int, l int, r int, rt int) {
if L <= l && r <= R {
this.max[rt][0] = C
return
}
mid := (l + r) >> 1
if L <= mid {
this.update0(L, R, C, l, mid, rt<<1)
}
if R > mid {
this.update0(L, R, C, mid+1, r, rt<<1|1)
}
this.merge(this.max[rt], this.max[rt<<1], this.max[rt<<1|1])
}
// father 要前k名
// left k名
// right k名
func (this *SegmentTree) merge(father []int, left []int, right []int) {
for i, p1, p2 := 0, 0, 0; i < this.k; i++ {
if left == nil || p1 == this.k {
father[i] = right[p2]
p2++
} else if right == nil || p2 == this.k {
father[i] = left[p1]
p1++
} else {
if left[p1] >= right[p2] {
father[i] = left[p1]
p1++
} else {
father[i] = right[p2]
p2++
}
}
}
}
func (this *SegmentTree) collect(L int, R int, l int, r int, rt int) {
if L <= l && r <= R {
for i := 0; i < this.k; i++ {
this.query[rt][i] = this.max[rt][i]
}
} else {
mid := (l + r) >> 1
leftUpdate := false
rightUpdate := false
if L <= mid {
leftUpdate = true
this.collect(L, R, l, mid, rt<<1)
}
if R > mid {
rightUpdate = true
this.collect(L, R, mid+1, r, rt<<1|1)
}
var left []int = nil
if leftUpdate {
left = this.query[rt<<1]
}
var right []int = nil
if rightUpdate {
right = this.query[rt<<1|1]
}
this.merge(this.query[rt], left, right)
}
}
// // 暴力实现的结构
// // 为了验证
type Right struct {
arr []int
k int
}
func NewRight(nums []int, K int) *Right {
k := K
arr := make([]int, len(nums))
for i := 0; i < len(nums); i++ {
arr[i] = nums[i]
}
return &Right{arr: arr, k: k}
}
func (this *Right) topKSum(l int, r int) int {
heap := make([]int, 0)
for i := l; i <= r; i++ {
heap = append(heap, this.arr[i])
}
sum := 0
for i := 0; i < this.k && len(heap) > 0; i++ {
sort.Slice(heap, func(i, j int) bool {
return heap[i] > heap[j]
})
sum += heap[0]
heap = heap[1:]
}
return sum
}
// 为了验证
func randomArray(n int, v int) []int {
ans := make([]int, n)
for i := 0; i < n; i++ {
ans[i] = rand.Intn(v) + 1
}
return ans
}
执行结果如下:

2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k的更多相关文章
- Fineui 解决OnClientClick中无论是返回true或false,都依然执行后台代码的问题
有时写js代码验证数据,需要在OnClientClick中执行,如果符合条件执行后台代码,不符合则不触发后台代码.刚开始的时候无论返回true或false都会执行后台代码(asp.net写法),看了h ...
- 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?
昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- 不用循环,、es6创建一个长度为100的数组
问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标? 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1 ...
- java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}
/** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...
- 一个简单的算法,定义一个长度为n的数组,随机顺序存储1至n的的全部正整数,不重复。
前些天看到.net笔试习题集上的一道小题,要求将1至100内的正整数随机填充到一个长度为100的数组,求一个简单的算法. 今天有空写了一下.代码如下,注释比较详细: using System; usi ...
- 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合
给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...
- 创建一个长度是5的数组,并填充随机数。使用for循环或者while循环,对这个数组实现反转效果
package day01; import java.util.Random; /** * 首先创建一个长度是5的数组,并填充随机数.使用for循环或者while循环,对这个数组实现反转效果 * @a ...
- 用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。
用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据. 比如:[1, 2, 3, 3, 2, 2, 6, 7, 8, 9] 中 2 or 3 分析:这道题目,实现比 ...
- 【mysql】mysql查询 A表B表 1对多 统计A表对应B表中如果有对应,则返回true否则false作为A表查询结果返回
A表:goods_type B表:brand_config A:B = 1:N 一种商品类型 对应多条 品牌配置 ======================================== 需求 ...
随机推荐
- Go_day06
Go基础语法 错误和异常 什么是错误error 错误是指可鞥出现问题的地方出现了问题,这种情况在预料之中 func main() { //打开一个文件 file, err := os.Open(&qu ...
- Ubuntu 20.24 安装Postgresql 14
1.运行环境 WSL+Ubuntu 20.04 2.安装Postgresql 进入Linux命令行,参照Postgresql官网安装指南 # Create the file repositor ...
- 【BUUCTF】强网杯 2019随便注1 write up
输入万能密码1' or 1=1# ,判断存在sql注入, SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台. 万能密码原理: 万能密码能够绕过sql检测,在 ...
- 在wxpython框架写的GUI中调用GIF格式图片,显示在指定行列的方法
#首先需要从 wx.adv 模块导入 Animation, AnimationCtrl方法 from wx.adv import Animation, AnimationCtrl #然后在面板实现过程 ...
- 全网最详细中英文ChatGPT接口文档(四)30分钟快速入门ChatGPT——Models模型
@ 目录 Models Overview 概述 GPT-4 Limited beta GPT-3.5 Feature-specific models 特定功能的模型 Finding the right ...
- 四种OS网络属性配置
1.Windows BAT设置网络属性: netsh interface ip set address "Ethernet" static 192.168.31.223 255.2 ...
- Oracle 函数整理
一.字符控制函数 函数 结果 CONCAT('Hello','World') HelloWorld SUBSTR('HelloWorld',1,5) Hello LENGTH('HelloWorld' ...
- Linux Redhat ens33不显示IP问题
[第一步]:查看系统网卡设备 : ip addr show
- 修改Win+E映射
!!!!!!此过程需要修改注册表,请谨慎操作 作用 修改后可以实现Win+E快捷打开任意程序 从原始资源管理器到其它应用 注册表路径: HKEY_CLASSES_ROOT\Folder\shell\o ...
- 《3D编程模式》写书-第1天记录
大家好,我现在开始写书了,书名为:<3D编程模式> 我会在本系列博文中记录写书的整个过程,感谢大家支持! 这里是所有的的写书记录: <3D编程模式>写书记录 为什么写书 去年我 ...