首页 > 其他分享 >学习笔记(?):一类查询 kth 的整体二分 trick

学习笔记(?):一类查询 kth 的整体二分 trick

时间:2024-08-31 20:25:59浏览次数:3  
标签:二分 然后 查询 trick kth 数据结构

问题大概就是有若干次修改(也有可能没有)和若干次查询,查询形如查某个范围的 kth。

做法是,把可能成为答案的候选集合按照权值大小排序。询问集合可以不用管顺序。然后开始二分。

我们令 solve(l,r,L,R) 表示第 \(l\) 到 \(r\) 个询问的 kth 一定在候选序列的第 \(L\) 到 \(R\) 个数。此时我们令把 \([L,R]\) 均匀分成两部分,然后把左边一部分塞入某个数据结构,然后再对于 \(l\) 到 \(r\) 每个查询,求出有数据结构内有多少个元素能对它产生贡献。如果少于 \(k\) 个,则其答案明显在右半,此时把 \(k\) 减去贡献数,并将其标记为 B 类。否则答案在左半,直接标记为 A 类。最后再把 A 类统一移到所有 B 类的左边,然后两边递归计算。可以知道这样数据结构插入和查询次数都是 \(\mathcal O((n+q)\log n)\) 的。

然后你发现这是个万金油 trick 啊,很多题都可以直接无脑套。

标签:二分,然后,查询,trick,kth,数据结构
From: https://www.cnblogs.com/TulipeNoire/p/18390715/Parallel-Binsearch

相关文章

  • NC 二分查找-II
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述请实现有重复数字的升序数组的二分查找给定一个元素有序的(升序)长......
  • [Python手撕]二分法
    二分法二分法的几个位置比如01234567891233333456有时候想要寻找小于3的最大数字有时候想要寻找第一个满足>=3的数字,有时候想要寻找最后一个满足>=3的数字,有时候想要寻找小于4的最大数字nums=[1,2,3,4,5,5,5,5,5,6,7,8,9]n=......
  • F. Final Boss(二分,周期)
    题目来源:https://codeforces.com/contest/1985/problem/F//题意:你有n种攻击,每种攻击有周期和攻击力,如果当前回合是x,以为着第i种攻击,下次攻击是x+ci回合。现在有Boss,生命值为h,当h<=0的时候,Boss死亡。一开始所有攻击都没有冷却时间,问最少第几回合Boss死亡。//思路:“最开始无脑模......
  • 二分法查+范围内临近值查找
        1uint16FindPosition(uint8arr[],uint16length,uint8target)2{3uint16low=0;4uint16high=length-1;5uint16closest_position=0xFFFF;67if(target<arr[0]||target>arr[length-1])8{9......
  • 代码随想录算法训练营,29日 | 704. 二分查找,27. 移除元素,977.有序数组的平方,209.长度最
    数组基础文档讲解︰代码随想录(programmercarl.com)1.连续空间、相同类型元素2.元素只能覆盖3.二维数组的地址连续吗(C++连续,Java不连续)704.二分查找题目链接:704.二分查找文档讲解︰代码随想录(programmercarl.com)视频讲解︰二分查找日期:2024-08-29思路:第一反应是想到二分查......
  • 【C++二分查找】2271. 毯子覆盖的最多白色砖块数
    本文涉及的基础知识点C++二分查找LeetCode2271.毯子覆盖的最多白色砖块数给你一个二维整数数组tiles,其中tiles[i]=[li,ri],表示所有在li<=j<=ri之间的每个瓷砖位置j都被涂成了白色。同时给你一个整数carpetLen,表示可以放在任何位置的一块毯子的长度......
  • LeetCode-Python-1539. 第 k 个缺失的正整数(二分)
    给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。请你找到这个数组里第 k 个缺失的正整数。示例1:输入:arr=[2,3,4,7,11],k=5输出:9解释:缺失的正整数包括[1,5,6,8,9,10,12,13,...]。第5个缺失的正整数为9。示例2:输入:arr=[1,2,3,4],k=2......
  • Atcoder [AGC006D] Median Pyramid Hard 题解 [ 紫 ] [ 二分 ] [ adhoc ]
    MedianPyramidHard:二分trick加上性质观察题。trick我们可以二分值域,然后把大于等于它的数标记成\(1\),其他标记为\(0\)(有些题需要标记成\(-1\)),然后根据这个来check方案是否可行,这通常通过判断某个数是否是\(1\)来实现。本质上其实就是check大于等于它的数能否成为......
  • 代码随想录算法训练营第一天 | 数组part01:数组理论基础,704. 二分查找,27. 移除元素 97
    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合数组徐璈注意的是:数组的下标都是从0开始的数组内存空间是的地址是连续的正因为舒适的内存空间是连续的,所以在删除和增添元素的时候,需要移动其他元素的地址。在c++中,vector的底层实现是array,严格来说,vector是容......
  • 1894. 二分查找左侧边界
     代码#include<bits/stdc++.h>usingnamespacestd;inta[110000],n,q;intzc(intx){ intl=1,r=n,mid; while(l<=r) { mid=(l+r)/2; if(x<a[mid])r=mid-1; elseif(x>a[mid])l=mid+1; elseif(x==a[mid])r=mid-1; } if(a[l]==x)return......