数据结构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大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
随机推荐
- opencv6.1-imgproc图像处理模块之平滑与形态学操作
这个部分是<opencv-tutorials.pdf>的部分,这部分也是几大部分中例子最多的,其实这个教程的例子都很不错,不过有些看得出来还是c接口的例子,说明例子有些年头了,其实在&qu ...
- 在win8(win8.1)电脑上安装IIS,配置web服务器,发布网站
1.IIS安装: 打开控制面板——程序和功能——启用或关闭Windows功能——找到(Windows功能下)下的(Internet Infornation Services)把Web 管理工具和万维网 ...
- 理解JavaScript的作用域链
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- 关于Hellas和Greece
一直以来我就好奇,为什么希腊的中文名字“希腊”和英文名字”Greece”听起来都不像(就像“德国”不像“Germany”一样),而且,为什么在很多体育比赛中看到希腊运动员的衣服上都是“Hellas”, ...
- position为absolute的元素如何实现居中
当给div设置absolute时,该元素已经脱离文档流,呈现浮动状态,只能通过left,top,right,bottom来设置属性,要实现居中有两种方法: 一.css法 <div class=& ...
- 【摘录】某表含有N个字段超精简模糊查询方法
SELECT * FROM table where CONCAT(a,b,c......) like '%key%' select name from syscolumns where id=obj ...
- background-image 和 img
一:解决div里面的img图像宽度不变,高度不变! 超出div部分设置隐藏! 图片:1920x526 div容器: 1423x526 1. background-image:样式实现 img: 标 ...
- HV和VM 内存性能测试对比结果
安装工具: apt-get install mbw 使用 mbw 1024 测试 VM ubuntu12.04 : ldd --versionldd (Ubuntu EGLIBC 2.15-0ubun ...
- jQuery基础--样式篇(1)
1.jQuery简介:JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari ...
- [转]设计模式之六大原则——开闭原则(OCP)
原文地址:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...