求序列中第k大的元素(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=4251
n个数,求给定区间中间大小的元素的值
1 #include<cstdio> 2 #include<string> 3 #include<vector> 4 #include<algorithm> 5 #define N 100009 6 using namespace std; 7 int n; 8 int arr[N];//原数据 9 int od[N];//排序后 10 int lfnum[20][N];//元素所在区间的当前位置进入左孩子的元素的个数 11 int val[20][N];//记录第k层当前位置的元素的值 12 bool cmp(const int &x,const int &y){return arr[x]<arr[y];} 13 void build(int l,int r,int d) 14 { 15 if(l==r) return; 16 int mid=(l+r)>>1,p=0; 17 for(int i=l;i<=r;i++) 18 { 19 if(val[d][i]<=mid) 20 { 21 val[d+1][l+p]=val[d][i]; 22 lfnum[d][i]=++p; 23 } 24 else 25 { 26 lfnum[d][i]=p; 27 val[d+1][mid+i+1-l-p]=val[d][i]; 28 } 29 } 30 build(l,mid,d+1); 31 build(mid+1,r,d+1); 32 } 33 //求区间[s,e]第k大的元素 34 int query(int s,int e,int k,int l=1,int r=n,int d=0) 35 { 36 if(l==r) return l; 37 int mid=(l+r)>>1,ss,ee; 38 ss=(s==l?0:lfnum[d][s-1]); 39 ee=lfnum[d][e]; 40 if(ee-ss>=k) return query(l+ss,l+ee-1,k,l,mid,d+1); 41 return query(mid+1+(s-l-ss),mid+1+(e-l-ee),k-(ee-ss),mid+1,r,d+1); 42 } 43 int main() 44 { 45 int cas=0,m,l,r; 46 while(scanf("%d",&n)!=EOF) 47 { 48 printf("Case %d:\n",++cas); 49 for(int i=1;i<=n;i++) scanf("%d",arr+i),od[i]=i; 50 sort(od+1,od+n+1,cmp); 51 for(int i=1;i<=n;i++) val[0][od[i]]=i; 52 build(1,n,0); 53 scanf("%d",&m); 54 while(m--) 55 { 56 int num,k; 57 scanf("%d%d",&l,&r); 58 k=(r-l)/2+1;//中间大小 59 num=query(l,r,k); 60 int ans=arr[od[num]]; 61 printf("%d\n",ans); 62 } 63 } 64 }
转载于:https://www.cnblogs.com/qijinbiao/archive/2012/07/17/2594845.html
求序列中第k大的元素(划分树模板)相关推荐
- 怎么修改数组中指定元素_求数组中第K大的元素
问题描述 求无序数组int[] nums中第K大的元素. 例如 输入:nums[] = {9,5,8},k = 2 输出:8 输入:nums[] = {3,1,2,4,5,5,6},k = 4 输出: ...
- 减治算法——序列中第k大的数字
现在有一个无序序列T,我们现在的需求是寻找其中第k大的一个数字. 这种问题我一般就直接sort然后返回了,但是这里使用减治法,我们可以参考之前的快速排序的思路,先把整个数组从轴值划分,但是不用像快排那 ...
- 分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素
查找问题: 问题一:寻找一个序列中第k小的元素 对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素 分析思路: 假设无序序列存放在a[0 - n-1]中,若将a递 ...
- 求包含n(n>1)个元素的无序序列中第k小的元素。
求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...
- python第k序列元素查找_【python】寻找数组中第k大的元素
题目链接:https://www.nowcoder.com/question/next?pid=13956292&qid=298692&tid=26431616 方法一: 最简单直接的 ...
- 寻找数组中第k大的元素
这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. (1)最简单直接的方法:先排序再找 最简单直接的想法是首先进行排序.假设元素的数量不大,比如才几千个,那就可 ...
- 经典算法题:寻找数组中第k大的元素
这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. 扩展思考:如何处理数组中的重复元素?比如,对于数组a={1,2,2,2,3,3,3},第二大的元素应该是3还 ...
- 【分治算法】求n个元素序列中第2大的元素
题目:给出一个分治算法来找出n个元素序列中的第2大的元素. 方法一: 一次遍历求解[不是分治] 思路: 默认第一个数就是第一大,第二个数字就是第二大,然后依次遍历维护这个假设. //依次遍历的方法 i ...
- 求序列中第k小的数_推荐算法序列建模现状
本篇文章主要是自己记录的相关序列建模.用户行为embedding向量的调研现状. 目录 一.序言 二.序列编码 (a)RNN (b)CNN (c)Attention 三.相关文献 1.attentio ...
最新文章
- 开启报名丨智源论坛 · 北大教授宋令阳:超材料感知与通信
- 桶排序python实现
- PHP通过Thrift操作Hbase
- 如何写windows系统已保护的内存区域
- Springboot整合一之Springboot整合RabbitMQ
- 谷歌手机Nexus和Pixel系列研发代号
- python ndimage_Python ndimage.zoom方法代码示例
- mysql非阻塞通信协议_NIO 的非阻塞式网络通信
- 别再找Axure XX版,这款原型工具永久免费!
- Arduino IDE+_Attiny13/85实践(三) Lilypad Attiny85编程
- GPS从入门到放弃(一) --- GPS基础原理
- win7怎么清理java缓存文件夹_win7c盘内存清理最彻底的方法
- 我知道你在淘宝买过很多东西,但是你买过一所大学吗
- 基于python可视化的拉勾网招聘岗位分析
- ssm共享充电宝管理系统计算机毕业设计
- 角色攻击、角色特殊动作
- ElementUI 文件上传传递额外参数
- app上架360手机助手流程
- 2023最新软件工程毕业设计题目汇总
- Scrapy学习——爬取智联招聘网站案例