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 一种商品类型 对应多条 品牌配置 ======================================== 需求 ...
随机推荐
- PHP 计算一个月第一天和最后一天
$fistday= date('Y-m-1 23:59:59'); $lastday= strtotime("$fistday+1 month -1 day");
- SQL 2019 卸载方法
一.关闭服务 1. win+r services.msc 打开服务,关闭与SQL有关的服务内容. 二.卸载应用 1.win+r control 打开控制面板---卸载程序---卸 ...
- DBeaver的使用
1.下载安装: https://dbeaver.io/download/ 2.下载后解压到指定目录,双击安装包: 然后 进行连接,在连接数据库的时候,会提示下载文件,下载的时候老是出错,选择强制下载就 ...
- IPAD做电脑的绘图板
方法:Microsoft远程桌面 即 RD CLIENT
- laravel groupBy 分页
$model=DB::table('tablebname') ->where(function($query) use ($res){ $query->where('xx','xx'); ...
- 【转载】Python:logging详细版
转载自:https://www.cnblogs.com/Nicholas0707/p/9021672.html 一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件 ...
- python内置函数len()
len() len()函数用于返回对象(字符串.元组.列表和字典等)的长度或元素个数 len()函数的语法: len(s) 代码示例 print(len(range(10))) print(len([ ...
- Python学习笔记--判断语句的延续
if else语句 示例: 需要注意的是,if后面必须有条件,而else后面可以不需要判断条件 案例: 实现: if elif else 语句 多条件判断,if 和 elif 后面必须有条件,else ...
- 声网深度学习时序编码器的资源预测实践丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网大后端智能运营算法团队 算法工程师@黄南薰. 随着深度学习技术的发展,编码器的结构在构建神经网络中成为了热门之选,在计算机视觉领域有众多成功案 ...
- Salesforce Javascript(三) 小结1
本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions https://developer.mozi ...