静态区间第k大(划分树)
POJ 2104为例【经典划分树问题】
思想:
利用快速排序思想,
- 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半。
- 查询时,在建树过程中利用leftsum[p][i]数组保存有多少个数划分到第p层,第i个位置的左边。每次查询计算出每个区间有多少数被放入左子树,小于等于k则说明所求数在左子树,继续查询其左子树,反之则查询右子树。l==r时则找到。
- 时间复杂度O(nlogn+mlogn)
代码:
#include<cstdio>
#include<algorithm>
using namespace std;//[]
const int maxn = 100010;
int tree[20][maxn];//每层每个位置的值
int sorted[maxn];//排好序的数组,方便寻找中值
int leftsum[20][maxn];//有多少个数分到该层该位置左边
void build(int p, int l, int r)
{
if(l == r) return;
int mid = (l + r)/2;
int same = mid - l + 1;
int x = sorted[mid];
for(int i = l; i <= r; i++){
if(tree[p][i] < x) same--;
}//与中值相等的数填满区间一半
int tl = l, tr = mid + 1;
for(int i = l; i <= r; i++){
if(tree[p][i] < x)
tree[p + 1][tl++] = tree[p][i];
else if(tree[p][i] == x && same>0){
tree[p + 1][tl++] = tree[p][i];
same--;
}else
tree[p + 1][tr++] = tree[p][i];
leftsum[p][i] = leftsum[p][l-1] + tl - l;
}
build(p + 1, l, mid);
build(p + 1, mid + 1, r);
}
//[L,R]中的[l,r]的第k大数
int query(int L, int R, int l, int r, int p, int k)
{
if(l == r) return tree[p][l];
int mid = (L + R)/2;
int cnt = leftsum[p][r] - leftsum[p][l-1];
if(cnt >= k){
int newl = L + leftsum[p][l-1] - leftsum[p][L-1];
int newr = newl + cnt - 1;
return query(L, mid, newl, newr, p+1, k);
}else {
int newr = r + leftsum[p][R] - leftsum[p][r];
int newl = newr - (r - l - cnt);
return query(mid+1, R, newl, newr, p+1, k - cnt);
}
}
int main (void)
{
int n, m;scanf("%d%d",&n,&m);
for(int i = 1; i <=n; i++){//下标从1开始
scanf("%d",&tree[0][i]);
sorted[i] = tree[0][i];
}
sort(sorted+1, sorted+n+1);
build(0, 1,n);
int s, t, k;
while(m--){
scanf("%d%d%d",&s,&t,&k);
printf("%d\n",query(1, n, s, t, 0, k));
}
return 0;
}
划分树还是挺好理解的,接下来看看归并树和主席树。
静态区间第k大(划分树)的更多相关文章
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- 主席树(静态区间第k大)
前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- HDU3473--Minimum Sum(静态区间第k大)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
- 静态区间第k大(主席树)
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
- POJ2104-- K-th Number(主席树静态区间第k大)
[转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...
- HDU 2665 Kth number(主席树静态区间第K大)题解
题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...
随机推荐
- 初学Ajax
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...
- JS格式化工具(转)
<html> <head> <title>JS格式化工具 </title> <meta http-equiv="content-type ...
- 30款jQuery常用网页焦点图banner图片切换
1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...
- android 开源
http://blog.csdn.net/xiaoxiao_job/article/details/45196119?ref=myread MPAndroidChart https://github. ...
- CSS 实现毛玻璃效果
Part.1 HTML结构 <!-- 最外层盒子 --> <div class="box"> <!-- 添加毛玻璃效果盒子 --> <di ...
- 【东软实训】SQLselect及其相关操作
SQL select 及相关操作 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp” ...
- Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)
Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...
- 除了上万的月薪之外,还有什么理由让我们必须学Python?
虽然目前的编程语言有很多,但是基础语法上的概念,本质上都是相通的.可以做到一通百通.所以没有必要为了学哪门语言纠结太多. python是目前市面上,我个人认为是最简洁&&最优雅& ...
- 修改mysql数据默认存储路径
1:停止mysql服务 2:找到配置文件路径 C:\ProgramData\MySQL\MySQL Server 5.6\my.ini 3:修改属性datadir 1.将C:/ProgramData/ ...
- js检测是哪个浏览器
项目中遇到在火狐浏览器下引入iframe页面,导致那个地方感觉掉下去一点,解决方案就是单独对火狐浏览器进行样式处理,需要检测浏览器类型,在网上找到此方法解决问题,也分享给大家 function get ...