数据结构2 静态区间第K大/第K小
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个.
"静态"指的是不带修改.
这个问题有多种做法:
1. 归并排序
POJ 2104, 静态区间第K小
#include <bits/stdc++.h>
using namespace std; const int N(1e5+);
int a[][N]; void merge(int id, int b, int e){
int mid=(b+e)>>;
for(int l=b, r=mid, i=b; i<e; i++){
if(l==mid) a[id][i]=a[id+][r++];
else if(r==e) a[id][i]=a[id+][l++];
else if(a[id+][l]<=a[id+][r]) a[id][i]=a[id+][l++];
else a[id][i]=a[id+][r++];
}
} void build(int id, int b, int e){
if(b+==e){
scanf("%d", a[id]+b);
return;
}
int mid=(b+e)>>;
build(id+, b, mid);
build(id+, mid, e);
merge(id, b, e);
}
//返回k在[l, r)与[L, R)交集上的Rank
int Rank(int id, int L, int R, int l, int r, int k){
if(l<=L&&R<=r){
return lower_bound(a[id]+L, a[id]+R, k)-a[id]-L;
}
int mid=(L+R)>>;
if(r<=mid){
return Rank(id+, L, mid, l, r, k);
}
if(l>=mid){
return Rank(id+, mid, R, l, r, k);
}
return Rank(id+, L, mid, l, r, k)+Rank(id+, mid, R, l, r, k);
}
//返回(l, r]中Rank(x)>=k的最小的x
int BS(int b, int e, int k, int n){
int l=-1e9-, r=1e9+, mid;
while(r-l>){
mid=(l+r)>>;
if(Rank(, , n, b, e, mid)>=k) r=mid;
else l=mid;
}
return r;
}
int main(){
int n, m; scanf("%d%d", &n, &m);
build(, , n);
for(int l, r, k; m--;){
scanf("%d%d%d", &l, &r, &k), l--;
printf("%d\n", BS(l, r, k, n)-);
}
}
这种做法的想法是将归并排序的过程记录下来, 这样就形成了一棵线段树, 这棵线段树的每个节点记录着它所代表的那个区间[L,R]排好序后的情形.
我们把这样的线段树称做归并排序树, 归并排序树能在$O(\log^2{N})$的复杂度内完成如下查询:
$\text{RANK}(l, r, x)$: 区间$[l,r]$内小于$x$的数的数目.
定义$\text{LEAST}(l, r, k)$为区间$[l,r]$上第$k$小的数, 则有
$\text{LEAST}(l, r, k) = \max \{x \mid \text{RANK}(l, r, x)<k\}$
因而对于询问$\text{LEAST}(l, r, x)$, 我们可以二分答案 $x$ + $\text{RANK}(l, r, x)$判断, 从而在$O(\log{M}\log^2{N})$的复杂度内完成查询, 其中$M$是元素的范围, $N$是区间总长度. 当然, 我们也可以现将数组$A[1\cdots N]$排序, 付出一个$O(N\log{N}$)的预处理复杂度, 然后便可做到单次查询$O(\log^3{N})$.
但我觉得这个复杂度还是太高了, (归并排序)这种做法应该还有优化的可能性, 有待研究.
2. 划分树
数据结构2 静态区间第K大/第K小的更多相关文章
- 无序数组求第k大/第k小的数
根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...
- POJ 2104 静态找区间第k大
静态区间第k大的问题,往往可以利用主席树来解决 这是主席树的第一道题 主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存 每一个节点保存的线段树都记录当前整段前缀区间的信息 但是因为 ...
- HDU3473--Minimum Sum(静态区间第k大)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 主席树初步学习笔记(可持久化数组?静态区间第k大?)
我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- 静态区间第k大(主席树)
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
- 主席树(静态区间第k大)
前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
随机推荐
- spring WebSocket详解
场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...
- PHP核心编程知识点
一.PHP基本语法 PHP标记:一共有四种,只推荐使用第一种 语句结束符:分号 注释:行注释(// #)和块注释(/* */),注释的规范 二.常见的输出语句 print echo var_du ...
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)
继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...
- JavaScript面试题收集(一)
简述javascript中的“=.==.===”的区别? 答:=赋值 ==比较是否一般相等 "3"==3 //会做类型的隐式转换,true ===比较是否严格相等 " ...
- scrollLeft的相关问题(js横向无缝滚动)
<div id="demo"> <div id="innerdemo"> <div id="demo1"> ...
- 1117Mysql prepare预处理语句
转自http://www.jb51.net/article/81378.htm 综述:一般用来拼凑SQL然后执行 MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这 ...
- 网络流 poj 3308 最小割
t个样例 n*m的矩阵 L个伞兵 给出每行每列装激光的花费 伞兵的位置 要求杀死所有伞兵 总费用为这些费用的乘积 求花费最小 建图 源点 -> 行 -> 列 -> 汇点 ...
- dede使用方法----调用导航
在这里,极力推荐学习dede的朋友们观看老李的零基础织梦仿站系列课程的视频,讲的超级棒的~~ 网址链接是:http://www.dede888.com/15daylessons.html. 好了,言归 ...
- java中是否会存在内存泄漏
会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中 ...
- 【USACO】Transformations(模拟)
Transformations A square pattern of size N x N (1 <= N <= 10) black and white square tiles is ...