http://acm.hdu.edu.cn/showproblem.php?pid=4251

n个数,求给定区间中间大小的元素的值

Sample Input
5
5 3 2 4 1
3
1 3
2 4
3 5
5
10 6 4 8 2
3
1 3
2 4
3 5
Sample Output
Case 1:
3
3
2
Case 2:
6
6
4

 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大的元素(划分树模板)相关推荐

  1. 怎么修改数组中指定元素_求数组中第K大的元素

    问题描述 求无序数组int[] nums中第K大的元素. 例如 输入:nums[] = {9,5,8},k = 2 输出:8 输入:nums[] = {3,1,2,4,5,5,6},k = 4 输出: ...

  2. 减治算法——序列中第k大的数字

    现在有一个无序序列T,我们现在的需求是寻找其中第k大的一个数字. 这种问题我一般就直接sort然后返回了,但是这里使用减治法,我们可以参考之前的快速排序的思路,先把整个数组从轴值划分,但是不用像快排那 ...

  3. 分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素

    查找问题: 问题一:寻找一个序列中第k小的元素 对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素 分析思路: 假设无序序列存放在a[0 - n-1]中,若将a递 ...

  4. 求包含n(n>1)个元素的无序序列中第k小的元素。

    求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...

  5. python第k序列元素查找_【python】寻找数组中第k大的元素

    题目链接:https://www.nowcoder.com/question/next?pid=13956292&qid=298692&tid=26431616 方法一: 最简单直接的 ...

  6. 寻找数组中第k大的元素

    这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. (1)最简单直接的方法:先排序再找 最简单直接的想法是首先进行排序.假设元素的数量不大,比如才几千个,那就可 ...

  7. 经典算法题:寻找数组中第k大的元素

    这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. 扩展思考:如何处理数组中的重复元素?比如,对于数组a={1,2,2,2,3,3,3},第二大的元素应该是3还 ...

  8. 【分治算法】求n个元素序列中第2大的元素

    题目:给出一个分治算法来找出n个元素序列中的第2大的元素. 方法一: 一次遍历求解[不是分治] 思路: 默认第一个数就是第一大,第二个数字就是第二大,然后依次遍历维护这个假设. //依次遍历的方法 i ...

  9. 求序列中第k小的数_推荐算法序列建模现状

    本篇文章主要是自己记录的相关序列建模.用户行为embedding向量的调研现状. 目录 一.序言 二.序列编码 (a)RNN (b)CNN (c)Attention 三.相关文献 1.attentio ...

最新文章

  1. 开启报名丨智源论坛 · 北大教授宋令阳:超材料感知与通信
  2. 桶排序python实现
  3. PHP通过Thrift操作Hbase
  4. 如何写windows系统已保护的内存区域
  5. Springboot整合一之Springboot整合RabbitMQ
  6. 谷歌手机Nexus和Pixel系列研发代号
  7. python ndimage_Python ndimage.zoom方法代码示例
  8. mysql非阻塞通信协议_NIO 的非阻塞式网络通信
  9. 别再找Axure XX版,这款原型工具永久免费!
  10. Arduino IDE+_Attiny13/85实践(三) Lilypad Attiny85编程
  11. GPS从入门到放弃(一) --- GPS基础原理
  12. win7怎么清理java缓存文件夹_win7c盘内存清理最彻底的方法
  13. 我知道你在淘宝买过很多东西,但是你买过一所大学吗
  14. 基于python可视化的拉勾网招聘岗位分析
  15. ssm共享充电宝管理系统计算机毕业设计
  16. 角色攻击、角色特殊动作
  17. ElementUI 文件上传传递额外参数
  18. app上架360手机助手流程
  19. 2023最新软件工程毕业设计题目汇总
  20. Scrapy学习——爬取智联招聘网站案例

热门文章

  1. 为什么合伙公司,一定要重视退出机制呢?
  2. 给你揭密一个爆款文案套路,各行各业,谁用谁火
  3. 教大家一个简单的办法
  4. 投简历没回音?你没写到点子上,HR当然不看
  5. 现在新电脑主板带WiFi,实不实用,稳定吗?
  6. 手机怎样才能接收到五公里外的WiFi信号?
  7. iPhone xs是最尴尬的一款手机吗?为什么?
  8. Even better, if you don’t want to answer and
  9. 如何使用PowerShell处理SQL Azure数据库
  10. team explorer_我的Team Explorer 2015在哪里?