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 一种商品类型 对应多条 品牌配置 ======================================== 需求 ...
随机推荐
- U-boot分析之编译体验
1. 如图可以看到的是PC和嵌入式系统的区别 PC第一步是上电,进入BIOS而嵌入式系统进入bootloader 接着进入操作系统而嵌入式式进入Linux内核 PC识别C盘,D盘,而嵌入式系统则挂载根 ...
- HGD1-LSP-函数集-网络整理
CAD LSP函数集 header
- 开学考--MIS系统(javaweb的开学练习--网络新闻发布系统)
关于本次考试的相关理解 看到题目的时候,第一反应是这道题不难,之前已经做过十分类似的题目了,然后对于难度是很有自信的(当然,对于用户的权限管理部分,还是很懵): 而第二反应就是,题量挺大的,我在这有限 ...
- 关于报出这样的错误:org.apache.catalina.core.StandardWrapperValve.invoke 在路径为/tt1016_war_exploded的上下文中,Servlet[Servlet.m的解决方法
从23:30开始报错检查,现在才弄好,发出来分享一下 错误界面: 首先,我们需要检查一下我们利用DBUtil.java文件中引用的db文件名称是否正确,(我就是因为没有注意到文件名称是否正确报出500 ...
- git clone的时候出现 fatal: unable to access 'https://github.com/...':OpenSSL SSL_read: Connection was reset, errno 10054解决方法
git clone的时候出现fatal: unable to access 'https://github.com/...':OpenSSL SSL_read: Connection was rese ...
- 加密脚本分析—evil.py
加密脚本分析-evil.py 1.题目 源文件 一共两个文件 enc_flag.txt evil.py(原文件无注释) 1 # coding: utf-8 2 3 import base64 4 im ...
- RTE NG-Lab:一起探索下一代实时互动新世界
互联网已经彻底改变了我们的工作和生活.从纸书信笺,到智能手机中的 App,再到 VR 头显,实时互动体验逐代升级,已经成为了我们生活的一部分.随着元宇宙的爆火,新增的实时互动场景日益颠覆着我们的想象力 ...
- 音频和视频流最佳选择?SRT 协议解析及报文识别
我们所知道 SRT 是由 Haivision 和 Wowza 开发的开源视频流协议.很多人会认为在不久的将来,它被是 RTMP 的替代品.因为 RTMP 协议安全性稍低,延迟相对较高 ,而相对于 SR ...
- 阿里云OSS前端直传+net core后端签名
OSS前端直传+后端签名 一.服务端签名后前端直传 首先安装阿里云SDK Aliyun.OSS.SDK.NetCore public static string accessKeyId = " ...
- docker方式实现postgres数据持久化离线安装
保存镜像 root@hello:~# docker pull postgres Using default tag: latest latest: Pulling from library/postg ...